【发布时间】:2019-03-08 12:35:57
【问题描述】:
我是 C 编程新手。我曾经认为使用exit() 是最干净的进程终止方式(因为它能够删除临时文件、关闭打开的文件、正常进程终止......),但是当我在终端上尝试man exit 命令时(Ubuntu 16.04.5, gcc 5.4.0) 我看到下面这行:
exit() 函数使用了一个不受保护的全局变量,所以 它不是线程安全的。
在那之后,我尝试对exit() 的更好替换进行一些研究(从一开始就改变我的编程行为)。这样做时,我遇到了this 问题,其中提到了exit() 的副作用,建议正确使用atexit() 来解决问题(至少部分解决)。
在某些cases 中,使用abort() 优于exit()。最重要的是,this 问题表明atexit() 也可能是有害的。
所以这是我的问题:
- 是否有任何通用且更好的进程终止方式(保证像
exit()一样清理并且在任何情况下都不会对系统造成损害)? - 如果第一个问题的答案是否定的!那么终止进程的最佳方式是什么(包括最有用的情况)?
【问题讨论】:
-
在 Linux、macOS 和 Windows 等现代受保护系统上,进程分配的大部分资源不是由
exit释放,而是由操作系统本身释放。避免任何资源泄漏的最好方法仍然是自己清理:您分配或创建的任何资源,在从main函数返回之前,您需要解除分配或释放或销毁。 -
当您开始编写多线程程序时,是开始担心
exit()的线程(非)安全性的好时机。更重要的是,对退出处理函数和atexit()的价值持怀疑态度。当exit()的作用是终止程序时,谁真正关心它是否不是线程安全的?只有在特殊情况下——可能涉及atexit()——才有意义。 -
另外,如果普遍需要比
exit()更好的东西,那么就会存在这样的功能。如果exit()存在一般性问题,将予以修复。 -
调用 free() 将虚拟内存返回到将不复存在的地址空间中的堆是浪费时间,包括 CPU 和已用时间。