作业内容
- 创建一个孤儿进程
- 创建一个僵尸进程
1. 孤儿进程主函数
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork(); //创建子进程
if(pid > 0)
{
sleep(2); //父进程休眠两秒后退出
printf("Parent process is ready to exit.\n");
exit(0);
}
else if(0 == pid)
{
pid_t ppid;
while(1)
{
if((ppid=getppid())==1) //若父进程进程号为1,则子进程为孤儿进程
{
printf("orphan process,pid = %d, ppid = %d\n",getpid(),ppid);
}
else
{
printf("child process,pid = %d, ppid = %d\n",getpid(),ppid);
}
sleep(1); //每隔一秒打印一次子进程信息
}
}
else
{
perror("fork");
return -1;
}
return 0;
}
测试孤儿进程
从图上可以看出,程序执行两秒后,父进程退出,子进程因此成为了孤儿进程。
在程序进行时,可以在终端输入ps -ajx指令查看进程状态,下图是在父进程退出前,也就是程序开始后两秒内的进程状态。
可以看到此时./a.out的父进程子进程都在正常运行着,且两个进程都处于阻塞态,接下来看看父进程退出后的进程状态。
可以看到子进程还存在,且它的父进程进程号为1,说明该子进程已经变成了孤儿进程。
2.僵尸进程主函数
#include <stdio.h>
#include <stdlib.h>
#include <syspes.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork(); //创建子进程
if(pid > 0)
{
while(1) //父进程循环打印进程信息
{
printf("Father process, pid = %d\n",getpid());
sleep(1);
}
}
else if(0 == pid)
{
printf("Child process, pid = %d, ppid = %d\n",getpid(),getppid());
printf("Child process is ready to exit.\n");
exit(0); //子进程退出
}
else
{
perror("fork");
return -1;
}
return 0;
}
测试僵尸进程
从上图可以看出,子进程打印了一次信息之后就退出了程序,只剩下父进程一直循环打印信息,在手动关闭父进程之前,我执行了ps -ajx指令查看进程状态,结果如下:
可以看到子进程状态为Z+,其中Z代表Zombie即僵尸进程,+代表输出在前端。