退出子进程(c)

时间:2012-09-02 20:49:56

标签: 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*/
}   
}

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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

我会引用MSDN online,因为它在我的最爱中:)

相关问题