C:程序退出时执行某些操作

Fra*_*lea 9 c exit

在C中,如果我的应用程序意外结束,我可以在此之前调用函数吗?我正在向数据库(processRunning = 1)写入一个标志,以阻止其他应用程序启动类似的进程.当应用程序结束时,它不会改变该标志.

Con*_*ius 6

查看atexitC标准库的API.

  • 这不是解决方案.它不会保护您免受异常终止.`atexit`函数在实践中基本没用,除了在永远不会变大或变成库的小程序中,它的使用应该被认为是有害的,因为它必然涉及全局变量/全局状态. (4认同)
  • 您可能已经知道这一点,但网络中断和电源故障等问题可能会阻止这种代码运行.每隔'n'分钟就可以更加健壮地将时间戳写入数据库,并让数据库在没有时间戳的'n + m'分钟后清理废弃的标志. (2认同)

R..*_*R.. 5

在POSIX上,正确的解决方案是使用共享内存中的强大互斥锁来保护数据.如果你的进程因强大的互斥锁而死亡,另一个试图锁定互斥锁的程序将不会死锁,而是会返回EOWNERDEAD,然后它有机会清理受互斥锁和调用保护的状态pthread_mutex_consistent.

编辑:如果你只想阻止程序的多个实例运行,肯定有更好/更简单的方法,比如对数据库文件进行锁定.