介绍
父子进程之间的关系会出现孤儿进程与僵死进程;
- 僵死进程为父进程还没有结束,子进程结束了自己行程,可能是正常结束也可能是因为某些意外而结束,其中可以通过wait或者waitpid查看其原因,在前面几篇文章中有所介绍;
- 孤儿进程则与之相反,即为父进程结束了自己的行程——正常结束或者异常退出,但子进程还依旧存在,此时子进程的父进程的pid则为1。内核会将孤儿进程的父进程设置为1;
孤儿进程
因为进程之间的内容是相互独立的,因此对于程序来说孤儿进程的伤害并不大;只不过是占用相关的内存和CPU利用而已; 在前文中,主要展示的都为僵尸进程,本文主要代码展示的为孤儿进程的内容。
- 创建进程
- 父进程用一段时间休眠,用于子进程显示其父进程的pid
- 子进程用一段时间休眠,用于父进程正常结束,并显示其僵尸进程的父进程
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
pid_t p = fork();
if(p < 0)
{
cout<<"error"<<endl;
exit(1);
}
else if(p == 0)
{
// 子进程
cout<<"I am son process mypid = "<<getpid()<<" my father pid="<<getppid()<<endl;
sleep(5); // 用于父进程结束之后显示
cout<<"I am son process mypid = "<<getpid()<<" my father pid="<<getppid()<<endl;
}
else
{
cout<<"I AM FATHER PROCESS MYpid = "<<getpid()<<" MYSONPID = "<<p<<endl;
sleep(1); // 用于子进程可以显示父进程
cout<<"FATHER DESTROY"<<endl;
}
return 0;
}
具体展示,可以看到子进程显示的父进程为其pid = 1;
? aloneFork ./a.out
I AM FATHER PROCESS MYpid = 23907 MYSONPID = 23908
I am son process mypid = 23908 my father pid=23907
FATHER DESTROY
? aloneFork I am son process mypid = 23908 my father pid=1
|