gpt4 book ai didi

c++ - 我们应该在子进程中使用退出还是返回

转载 作者:IT王子 更新时间:2023-10-29 00:38:00 26 4
gpt4 key购买 nike

说我已经使用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。据我了解,_exitexit 不会自动调用析构函数,因此最好调用 return 而不是 exit在子进程中?或者因为我见过的所有示例都是 C,而不是 C++,所以他们不需要担心析构函数?

最佳答案

您可以使用 _exitexit,但不应使用 return。当你 fork 一个 child 时,你保留了整个调用堆栈作为 fork child 的一部分。因此,如果您使用 return,您最终会在整个程序中返回,可能会继续并执行其他任务,这几乎肯定不是您想要的。

例如,如果您有这样的片段:

int get_value()
{
pid_t pid;
if (!(pid = fork())) {
int x = 0;
// do something with x.
exit(x);
}
else {
int status;
wait(&status);
return status;
}
}

int main()
{
int value = get_value();
switch (get_value()) {
case 0:
// call f
break;
case 255 << 8:
// call g
break;
}
}

您最终可能会调用 fg 或使用 return 进行其他工作,这绝对不是您想要的。

如果调用 _exit,则不会调用使用 atexit 注册的函数。在线程环境中这是正确的做法。如果您不在线程环境中工作,并且您没有使用 atexit 注册任何处理程序,那么它们在功能上应该是等效的。

如果您希望调用子进程中的析构函数,请将子进程代码放在它自己的函数中,并让它的变量在超出范围时自动销毁。 exit 不会为您销毁对象,这很好,因为通常您不想在子进程中销毁在父进程中创建的对象。

关于c++ - 我们应该在子进程中使用退出还是返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com