更好地替换C中的exit()和atexit()

时间:2019-03-08 12:35:57

标签: c linux gcc exit atexit

我是C编程新手。我曾经认为使用exit()是终止进程的最干净方法(因为它能够删除临时文件,关闭打开的文件,正常终止进程...),但是当我尝试使用man exit命令时终端(Ubuntu 16.04.5,gcc 5.4.0)我看到以下行:

  

exit()函数使用不受保护的全局变量,因此   它不是线程安全的。

之后,我尝试进行一些有关更好地替代exit()的研究(从一开始就改变了我的编程行为)。这样做时,我遇到了this问题,其中提到了exit()的副作用,建议正确使用atexit()来解决问题(至少部分解决)。

在某些cases中,使用abort()exit()更为可取。最重要的是,this问题表明atexit()也可能有害。

这是我的问题:

  • 是否有任何通用且更好的过程终止方法(可以保证像exit()那样进行清理,并且在任何情况下都不会损害系统)?
  • 如果第一个问题的答案是“否!”,那么终止过程的最佳可能方式是什么(包括最有用的情况)?

2 个答案:

答案 0 :(得分:3)

  

什么是终止进程的最佳方法

  1. 如果要使用单线程,请仅使用exit(),因为您的代码不会使用多线程。
  2. 否则,请确保除一个线程外的所有线程都在最后一个线程之前结束,然后由于上述1.安全地调用exit()

答案 1 :(得分:1)

鉴于电源/硬件故障随时可能发生,因此在许多非平凡的多线程应用程序中很难可靠地终止带有用户代码的线程以及使用内存池等的混乱性质,这是极其困难的。最好设计出可以在启动时清除临时文件等的应用程序和系统,而不是尝试对关机进行微观管理。

“在退出之前清理所有分配的资源”听起来像是在课堂或演讲中的好建议,但是当面对不断变化的十几个线程,队列和池时,很快就变成了整个信天翁的链条动态系统。

如果可以的话,如果您正在运行一个非琐碎的操作系统,请让它完成工作并为您清理。它比您的用户代码要好得多。