基本概念
Linux中子进程由父进程创建,子进程可以在创建其他的子进程并成为他们的父进程,子进程和父进程的运行是一个异步过程:父进程不知道子进程运行状态。当一个进程终止后,他的父进程需要调用wait()和waitpid()函数来获取进程的终止状态。
Linux保证只要父进程想知道子进程结束是的状态信息,就可以得到。所以每一个进程结束后,内核释放该进程的所有资源,但仍然为其保留一定的信息(pid ,退出状态,运行时间等),直到父进程获取后才释放,则就导致,如果父进程没有获取到这些信息,这些信息将不会释放,其进程号就会一直被占用。
僵尸进程
子进程结束,父进程没有获取子进程结束的信息状态,子进程的进程描述符一直保存在系统中
3 int main()
4 {
5
6 int pid = fork();
7 if(pid < 0)
8 perror("fork error");
9 else if(pid == 0){
10 printf("i am child!pid = %d,ppid = %d\n",getpid(),getppid());
11 exit(0);
12 }
13 else{
14 sleep(50);
15 printf("i am parent!pid = %d,ppid = %d\n",getpid(),getppid());
17 }
19 return 0 ;
20 }
21
让父进程sleep 保证子进程先结束
孤儿进程
一个父进程退出,而他的一个或者多个子进程还在运行,那么这些子进程变成孤儿进程,孤儿进程将被init进程(pid为1)所收养,并由init进程对他们完成状态收集的工作。
问题和危害
注意:所有的进程在exit后不会立马消失,而是进入僵死状态保留部分信息,等待父进程处理,若果父进程未处理则变成僵死进程。
僵死进程:大量的僵死进程得不到释放,会导致系统不能产生新的进程。僵死进程的根本问题在于父进程没有及时对子进程的结束信息作出处理。
孤儿进程:有1号进程回收孤儿进程,不会造成危害