考虑这段代码:
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
?
答案 0 :(得分:5)
您可以期望exit
调用atexit
注册的功能。 _exit
不会这样做。通常,每个注册的清理处理程序应该只执行一次,通常是在它注册的过程中。这意味着子进程应_exit()
,父进程应为exit()
。如果子进程执行exec
某个其他程序(可能是最常见的情况),则该新程序将覆盖任何已注册的处理程序,这意味着您将返回exit()
。
关于外部函数:我会说你应该调用exit
但是如果父在执行fork之前注册了非平凡的东西atexit
,你应该准备好遇到奇怪的行为。所以尽量提早分叉,除非你的意思是孩子的exec
。并着眼于您自己的代码和您使用的库可能安装的退出处理程序。 I / O缓冲区刷新就是一个例子。
答案 1 :(得分:3)
exit()
在清理后终止,而 _exit()
会立即终止。
我建议在正常情况下, exit()
是正确的方法 - 但如果您选择 _exit()
,我相信您会明白自己在做什么的?!
我会引用MSDN online,因为它在我的最爱中:)