孤儿进程
孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid;
pid = fork();
if(pid==-1)
{
perror("fork:");
exit(1);
}
else if(pid>0)
{
sleep(1);//
printf("i am parant.\n");
}
else
{
printf("i am child.pid=%ld,ppid=%ld\n",getpid(),getppid());
sleep(3);
printf("i am child.pid=%ld,ppid=%ld\n",getpid(),getppid());
}
return 0;
}
打印结果,发现父进程先结束,子进程后结束,子进程的父进程改变了。:
[[email protected] test2]# ./orphan
i am child.pid=423,ppid=422
i am parant.
[[email protected] test2]# i am child.pid=423,ppid=1
僵尸进程
僵尸进程: 进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。
【zoom .c】
特别注意,僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的,而僵尸进程已经终止。思考!用什么办法可清除掉僵尸进程呢?
设计一个僵尸进程:
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid;
pid = fork();
if(pid == -1)
{
perror("fork:");
exit(1);
}
if(pid == 0)
{
printf("i am child .pid = %ld,ppid = %ld\n",getpid(),getppid());
sleep(10);
printf("child did.\n");
}
else if(pid > 0)
{
sleep(1);
while(1)
{
printf("i am parent. pid = %d,myson= %ld\n",getpid(),pid);
sleep(1);
}
}
return 0;
}
打印结果,子进程已经运行结束,但父进程并没有回收子进程。
[[email protected] test2]# ./zombie
i am child .pid = 482,ppid = 481
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
child did.
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
……