退出子进程(c)

pol*_*nux 4 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());
    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*/
}   
}
Run Code Online (Sandbox Code Playgroud)

当退出子进程时,最好写_exit而不是exit但如果我需要调用外部函数并进入此函数我想要退出,我应该写什么?_exit还是exit

MvG*_*MvG 5

您可以预期exit调用注册的功能atexit._exit不会这样做.通常,每个注册的清理处理程序应该只执行一次,通常是在它注册的过程中.这意味着子进程应该_exit()和父进程一样exit().如果子进程执行了exec一些其他程序,这可能是最常见的情况,那么新程序将覆盖任何已注册的处理程序,这意味着您将返回exit().

至于外部函数:我会说你应该调用exit但是如果父进程atexit在执行fork之前注册了非平凡的东西,你应该准备好遇到奇怪的行为.所以尽量分叉,除非你的意思是exec在孩子身上.并着眼于您自己的代码和您使用的库可能安装的退出处理程序.I/O缓冲区刷新就是一个例子.