【发布时间】:2019-05-11 12:24:10
【问题描述】:
说我用fork创建了一个子进程。这是一个例子:
pid_t pid=fork();
if (pid==0) /* child */
{
// do something
exit(0); // _exit, exit or return????
}
else /* parrent */
{
wait(nullptr);
return 0;
}
我见过很多fork 的例子。其中一些使用_exit 终止子进程以避免刷新I/O 缓冲区,其他使用exit 终止子进程。但他们都没有使用return。据我了解,_exit 和exit 不会自动调用析构函数,那么在子进程中调用return 而不是exit 会更好吗?还是因为我见过的所有示例都是 C,而不是 C++,所以它们不需要担心析构函数?
【问题讨论】:
-
有些人认为从
main返回是正常程序终止的唯一形式,而在其他任何地方退出或中止它被认为是异常终止。这当然是因为它很难推理程序控制流或跟踪未初始化的顺序是否正确。请注意,C 中没有析构函数,但这意味着您必须担心 10 倍以上,因为您需要手动执行所有取消初始化。 -
在 C 中,通过
return x;或调用exit(x)离开main()没有区别。 -
在 C 中,除了在
main()returning 从函数或exit()ing 中执行此操作之外,过程确实是不同的。 -
@alk 但在 C++ 中,从 main() 返回或调用 exit(3) 确实不同,正如 OP 正确注意到的那样。但它是在 main() 中定义的自动变量的析构函数,在 exit(3) 的情况下不会被调用,而不是静态/全局变量,无论程序是从 main() 返回还是调用,它们的析构函数都会被调用明确退出(3)。
-
出于好奇,您需要调用哪些析构函数来退出进程清理尚未处理其工作的析构函数?每当一个进程退出时,它的所有内存都会被释放,并且它的所有文件描述符都会为你关闭,即使你泄漏了内存或让文件保持打开状态。