孤儿进程以及孤儿进程组

孤儿进程

正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

解释:

  孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

孤儿进程测试如下:

  1 #include                                                           
  2 #include
  3 #include
  4 #include
  5 
  6 int main()
  7 {
  8         pid_t pid;
  9 
 10         pid=fork();
 11 
 12         if(pid<0)
 13         {
 14                 perror("fork error");
 15                 exit(1);        
 16         }
 17         else if(pid==0)
 18         {
 19                 printf("I am the child process.\n");
 20 
 21                 printf("pid:%d\tppid:%d\n",getpid(),getppid());
 22                 printf("I will sleep five seconds.\n");
 23 
 24                 sleep(5);//让父进程先结束,使得子进程成为孤儿进程
 25                 printf("pid%d\tppid:%d\n",getpid(),getppid());
 26                 printf("child process is exited\n");
 27         
 28         
 29         }
 30         else
 31         {
 32                 printf("I am father process.\n");
 33                 sleep(1);
 34                 printf("father process is exiting\n");
 35         }
 36 return 0;
 37 }                                                                     

孤儿进程以及孤儿进程组_第1张图片

孤儿进程组

定义1
该组中的每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员
定义2
不是孤儿进程组的条件是,该组中有一个进程,其父进程属于同一会话的另一个组中。
也就是说,将该父进程终止就能使该进程组成为僵尸进程孤儿进程(感谢网友”hello”的指正)。这个父进程通常是这个进程组的组长进程,因为只有它的父进程在这个进程组外,而其他进程(组长的子进程)的父进程都是组长进程的ID。

会在后面的学习中补充说明。

你可能感兴趣的:(Linux)