一、孤儿进程
孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,成为init进程领养孤儿进程。
1. 测试代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
pid_t pid;
pid = fork();
if(pid == -1)
{
perror("fork");
exit(1);
}
else if(pid > 0)
{
sleep(1);
printf("I'am parent pid = %d, parent ID = %d\n", getpid(), getppid());
}
else if(pid == 0)
{
printf("child pid = %d, parent ID = %d\n", getpid(), getppid());
sleep(3);
printf("child pid = %d, parent ID = %d\n", getpid(), getppid());
}
return 0;
}
输出结果:
二、僵尸进程
僵尸进程:进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸进程。ps(1)命令将僵尸进程的状态打印为Z.
回收僵尸进程的方法:杀死它的父进程。
特别注意,僵尸进程是不能使用kill命令清楚的,因为kill命令只是用来终止进程的,而僵尸进程已经终止。
1. 测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
pid = fork();
if(pid == 0) {
printf("---child, my parent = %d, going to sleep 10s\n", getpid());
sleep(10);
printf("---------child die --------------\n");
} else if(pid > 0) {
while(1) {
printf("I am parent, pid = %d, my son = %d\n", getpid(), pid);
sleep(1);
}
} else {
perror("fork");
exit(1);
}
return 0;
}
输出结果: