C:程序退出时做些什么

C:程序退出时做些什么,c,exit,C,Exit,在C语言中,如果我的应用程序意外结束,我能在这之前调用函数吗?我正在将一个标志写入数据库(processRunning=1),以防止其他应用程序启动类似的进程。当应用程序结束时,它不会更改该标志。查看C标准库的API。如果应用程序正常终止,它将运行通过atexit注册的函数。这是一个标准功能,可在和其他任何平台上使用,也可在中使用 请注意,“正常终止”是指通过调用exit()或从main()返回。如果您的应用程序通过abort()或\u exit()终止,或者从外部立即终止,则可能没有机会进行任

在C语言中,如果我的应用程序意外结束,我能在这之前调用函数吗?我正在将一个标志写入数据库(processRunning=1),以防止其他应用程序启动类似的进程。当应用程序结束时,它不会更改该标志。

查看C标准库的API。

如果应用程序正常终止,它将运行通过atexit注册的函数。这是一个标准功能,可在和其他任何平台上使用,也可在中使用


请注意,“正常终止”是指通过调用
exit()
或从
main()
返回。如果您的应用程序通过
abort()
\u exit()
终止,或者从外部立即终止,则可能没有机会进行任何清理。可能有更好的方法,可以在执行清理的包装程序中设置和清除标志,而不管程序如何终止,或者完全不使用此标志。

有更好的方法防止应用程序运行两次。一种解决方案是使用系统范围内的命名互斥体。另一个可能更简单的解决方案是锁定一个文件(打开以供写入)。即使当应用程序崩溃时,操作系统也会释放资源,并且您将能够再次启动应用程序,因为文件或互斥锁将不再被锁定

在POSIX上,正确的解决方案是在共享内存中使用健壮的互斥来保护数据。如果您的进程在一个健壮的互斥锁被保持的情况下死机,另一个试图锁定互斥锁的程序将不会死锁,而是返回
eownerded
,然后它有机会清除互斥锁保护的状态并调用
pthread\u mutex\u consistent


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

谢谢您的额外建议,Gilles。我在想一些类似于每隔几秒钟就进行一次应用程序检查,如果附加到特定PID的进程仍在运行。一种解决方案可能是尝试捕捉信号。(我想这不适用于Windows。)@Frank:注意PID检查不是万无一失的。PID可以被一个不相关的进程快速重用。@Victor:捕获信号只对可捕获的信号有效。如果应用程序被sigkill或OOM终止,或者如果它崩溃,捕获信号将没有帮助。(好吧,你可以抓住西格夫,但这很危险。你就是抓不到西格基尔。)好吧,我没想到。再次感谢。这不是一个解决方案。它不会保护您免受异常终止。
atexit
函数在实践中基本上是无用的,除了在永远不会变大或变成库的小程序中,它的使用可能被认为是有害的,因为它必然涉及全局变量/全局状态。你们可能都已经知道了这一点,但是像网络中断和电源故障之类的事情可能会阻止这种代码运行。每“n”分钟向数据库写入一次时间戳可能会更健壮,并让数据库在没有时间戳的“n+m”分钟后清除放弃的标志。感谢提供非常有用的信息。你应该考虑这么多事情。在我的例子中,上面的解决方案是完全足够的,因为进程的运行时间永远不会超过2分钟。我检查一个进程的运行是否超过了它将被自动终止的程度。@Catcall:基于轮询的解决方案很难看,浪费资源,并且健壮性差。正确的解决方案是使用一种锁定机制,当进程死亡或机器重新启动时,操作系统将自动解锁。@R:我的印象是OP向数据库写入的不仅仅是标志。如果他是的话,让数据库来清理是很有意义的。操作系统通常不会对此提供任何帮助。但是,如果数据库的唯一用途是存储标志——这似乎是使用数据库的奇怪原因——那么您是对的。