Unix 中的进程在哪一刻终止?是否需要在程序中编写诸如exit(0)
或 之类的命令来终止进程?return 0
我的问题是由以下代码引起的:
pid_t pid=fork();
if(pid < 0)
{
perror("Fork error\n");
return 1;
}
else if (pid==0) /* child */
{
printf("CHILD My pid is:%d\n",getpid());
}
else /* parrent */
{
wait(NULL);
exit(0);
}
在这个例子中,在子进程中我们不调用exit(0)
(所以我认为我们不会终止进程),在父进程中我们调用wait(NULL)
(所以我们应该等待进程结束)。程序终止,因此从逻辑上讲,子进程在某一时刻结束。你能解释一下子进程什么时候终止吗?如果孩子在之后终止
else if (pid==0) /* child */
{
printf("CHILD My pid is:%d\n",getpid());
}/* Probably the child process terminates here but then what is the point of using exit(0) */
,那么使用有什么意义呢exit(0)
?
答案1
AC 计划将在以下三种情况之一结束:
- 程序从
main
函数返回。如果返回值为0,则表示成功,否则返回值为退出状态。 C99 还允许(但不鼓励)main
具有void
返回类型的函数,其中返回 frommain
与从具有返回类型的 main 返回 0 具有相同的语义int
。 - 程序返回以下
exit
函数之一:exit
、或C11 中的_exit
新函数。quick_exit
这些函数都不返回,并且都具有终止程序的效果,但它们实际执行的操作有所不同(例如,quick_exit 刷新缓冲区但不运行荣誉atexit
调用)。 - 操作系统以某种方式杀死程序,例如,因为程序做了一些不允许做的事情。
答案2
exit(0)
(或者也许更理想地exit(EXIT_SUCCESS)
)可以用来明确表明一切顺利。也就是说,它更多地是向阅读代码的人提示预期会发生什么,并防止到达任何后续代码(可以为未到达的代码启用编译器警告)。子级可能还应该有一个_exit
调用来指示它已完成,否则代码将落入错误/子级/父级条件块后面的任何内容。
否则,进程可能会正常终止(通过exit
、return
inmain
或_exit
),或者通过调用、或通过吃掉导致程序退出的abort
信号(通过或来自其他地方)而异常终止。raise