4

考虑这段代码:

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*/
}   
}

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

4

2 回答 2

5

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

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

于 2012-09-02T21:01:56.327 回答
3

exit()清理后终止,而_exit()立即终止。

我建议在正常情况下,exit()这是正确的方法 - 虽然我相信如果你选择你会明白你在做什么_exit()?!

我会在网上引用 MSDN,因为它在我的收藏夹中 :)

于 2012-09-02T20:55:22.437 回答