从子进程退出(c)

从子进程退出(c),c,fork,C,Fork,考虑以下代码片段: void do_child(void); int main(void){ int n; pid_t child; printf("Write a number: "); scanf("%d", &n); if(n != 1){ exit(1); } child = fork(); if(child >= 0){ /* fork ok */ if(child == 0){ printf("Child pid: %d\n", getpid());

考虑以下代码片段:

void do_child(void);

int main(void){
int n;
pid_t child;
printf("Write a number: ");
scanf("%d", &n);
if(n != 1){
exit(1);
}
child = fork();
if(child >= 0){ /* fork ok */
 if(child == 0){
    printf("Child pid: %d\n", getpid());
    do_child();
    _exit(0);
  }
 else{ /* parent */
    printf("Child parent: %d\n", getpid());
    _exit(0);
 }
}
else{ /* fallito */
    perror("No fork");
    return 1;
}
return EXIT_SUCCESS;
}

void do_child(void){
/* some code here */
if(1 != 1){
    /* what to write here?? _exit or exit*/
}   
}
当从子进程退出时,最好编写
\u exit
而不是
exit
,但是如果我需要调用外部函数并在该函数中放入一个exit,我应该写什么<代码>\u exit或
exit

exit()
在清理后终止,而
\u exit()
立即终止

我建议,在正常情况下,
exit()
是正确的方法-尽管我相信如果您选择了
\u exit()
,您会明白自己在做什么

我将引用我最喜欢的内容:)

您可以调用注册到的函数。我不会那么做的。通常情况下,每个注册的清理处理程序应该只执行一次,通常是在其注册的过程中执行。这意味着子进程应该
\u exit()
,父进程应该
exit()
。如果子进程执行其他程序(这可能是最常见的情况),那么新程序将覆盖所有已注册的处理程序,这意味着您返回到
exit()


至于外部函数:我认为您应该调用
exit
,但如果父级在执行fork之前注册了非琐碎的东西
atexit
,您应该准备好遇到奇怪的行为。因此,除非你想在孩子身上执行
exec
,否则尽量早点叉。并关注您自己的代码和使用的库可能安装的出口处理程序。I/O缓冲区刷新就是一个例子。

每个进程都是某人的子进程(id为1的进程除外),在此基础上选择
\u exit
而不是
exit
是没有意义的。谁说“最好写
\u exit
而不是
exit
”?@KerrekSB该页面在所有事情上都是错误的。@NicholasWilson,这在很大程度上取决于析构函数本身。例如,如果析构函数清理临时文件或以其他方式销毁另一进程使用的资源,那么过早地运行这些文件可能确实很糟糕。内核可以在
\u exit
上很好地清理文件描述符之类的东西,而不需要析构函数。LOL:D我什么都不懂xD这里说,在没有退出的情况下终止子进程是危险的。。。看起来这些年来我一直很幸运,因为我很少(如果有的话)使用_exit()-而且我没有注意到他提出的问题!