exit()是一个标准库函数,会在退出前清理库中的用户态构建,关闭临时文件,刷新流缓冲区,关闭标准IO,并且会调用由atexit注册的函数。
_exit()是POSIX.1定义,只会调用内核中的清理过程(要看内核实现,windows下会刷新stdio)。
_Exit()是C99中定义,行为同_exit(),但是也属于implementation defined。
在fork()创建的子进程中,调用exit()通常会出错,因为这会导致stdio缓冲区被刷新两次,而且临时文件被意外清除。
在C++下这种情况会更糟,因为静态对象的析构可能无法正常运行;有一些特殊情况,例如daemon进程,父进程反而更有必要调用_exit()。
使用的基本原则是,绝大多数情况下,对于每个main入口exit()只能被调用一次。
vfork()创建的子进程,由于会影响到副进程的状态,使用exit()风险更大。
Notice: 在main函数中return会隐式调用exit()。
Ref:
https://stackoverflow.com/questions/2329640/how-to-exit-a-child-process-exit-vs-exit