孤儿进程
如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这是子进程的父进程就是init进程(1号进程).其实还是很好理解的
僵尸进程
有如果一个进程已经终止了,但是其父进程还没有获取其状态,那么这个进程就称之为僵尸进程.僵尸进程还会消耗一定的系统资源,并且还保留一些概要信息供父进程查询子进程的状态可以提供父进程想要的信息.一旦父进程得到想要的信息,僵尸进程就会结束.
僵尸进程避免
1 signal(SIGCHLD,SIG_IGN);
当子进程结束时,操作系统回向父进程发SIGCHLD信号,父进程对这个信号有个默认处理函数,这个默认处理函数就是什么都不做,如果父进程signal(SIGCHLD,SIG_IGN),就是告诉操作系统,自己忽略该信号,那操作系统就会自己处理该信号,操作系统处理方法就是自己回收。
#include<stdio.h>
#include <unistd.h>
#include<signal.h>
#include <sys/types.h>
void signal_wait(int isig)
{
wait(NULL);
printf("child is cleaned\n");
}
int main(void)
{
pid_t pid ;
signal(SIGCHLD,SIG_IGN); //1
//signal(SIGCHLD,signal_wait); //2
printf("before fork pid:%d\n",getpid());
int abc = 10;
pid = fork();
if(pid == -1)
{
perror("tile");
return -1;
}
if(pid > 0)
{
abc++;
printf("parent:pid:%d \n",getpid());
printf("abc:%d \n",abc);
sleep(20);
sleep(10);
}
else if(pid == 0){
abc++;
printf("child:%d,parent: %d\n",getpid(),getppid());
printf("abc:%d",abc);
exit(0);
}
printf("fork after...\n");
}
2 signal(SIGCHLD,handler);
父进程自己处理,可以在hander函数中用waitpid或wait回收。将上面代码的1处屏蔽,换为2。
3 父进程在fork子进程后,用wait()阻塞等待。
4 杀死父进程
杀死父进程后,子进程就会成为孤儿进程,然后系统就会将该孤儿进程过继给init进程,如果子进程退出后,init进程就会立马直接将其回收.