孤儿进程
正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。
解释:
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。
孤儿进程测试如下:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<errno.h>
4 #include<unistd.h>
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
该组中的每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员
定义2
不是孤儿进程组的条件是,该组中有一个进程,其父进程属于同一会话的另一个组中。
也就是说,将该父进程终止就能使该进程组成为僵尸进程孤儿进程(感谢网友”hello”的指正)。这个父进程通常是这个进程组的组长进程,因为只有它的父进程在这个进程组外,而其他进程(组长的子进程)的父进程都是组长进程的ID。
会在后面的学习中补充说明。