UNIX 中进程什么时候终止?

UNIX 中进程什么时候终止?

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 计划将在以下三种情况之一结束:

  1. 程序从main函数返回。如果返回值为0,则表示成功,否则返回值为退出状态。 C99 还允许(但不鼓励)main具有void返回类型的函数,其中返回 frommain与从具有返回类型的 main 返回 0 具有相同的语义int
  2. 程序返回以下exit函数之一:exit、或C11 中的_exit新函数。quick_exit这些函数都不返回,并且都具有终止程序的效果,但它们实际执行的操作有所不同(例如,quick_exit 刷新缓冲区但不运行荣誉atexit调用)。
  3. 操作系统以某种方式杀死程序,例如,因为程序做了一些不允许做的事情。

答案2

exit(0)(或者也许更理想地exit(EXIT_SUCCESS))可以用来明确表明一切顺利。也就是说,它更多地是向阅读代码的人提示预期会发生什么,并防止到达任何后续代码(可以为未到达的代码启用编译器警告)。子级可能还应该有一个_exit调用来指示它已完成,否则代码将落入错误/子级/父级条件块后面的任何内容。

否则,进程可能会正常终止(通过exitreturninmain_exit),或者通过调用、或通过吃掉导致程序退出的abort信号(通过或来自其他地方)而异常终止。raise

相关内容