僵尸进程和孤儿进程
1.父子进程的关系
独立的两个进程
互为父子关系
2.问题:
2.1.父进程先结束?
子进程就依托根进程init:孤儿进程
孤儿进程没有任何危害.
2.2.子进程先结束?
子进程会成为僵死进程.
僵死进程表面上不占用内存,CPU.但在进程任务管理树占用一个节点.
僵死进程造成进程名额资源浪费.(假如,我的程序里面最大允许有100个进程,当有100
个僵尸进程的时候,就不能跑起来其他进程了)
所以处理僵死进程.
3.僵死进程使用wait回收 不是杀死子进程哦。。。保持。。阻塞。。直到回收。
man 2 wait查看帮助
pid_t wait(int *status); 返回子进程的pid,并把子进程的状态信息保存到status中(如:子进程exit(88))
printf("%d\n",WEXITSTATUS(status));//返回状态88
4.父进程怎么知道子进程退出?
子进程结束通常会向父进程发送一个信号
SIGCHLD 17
这样父进程就不用傻傻的wait阻塞了,就可以去做其他事。
5.父进程处理子进程退出信号
signal(int sig,void(*fun)(int));
函数作用。。向系统注册:只要sig信号发生,系统停止进程,并调用函数fun
当函数执行完毕,继续原来进程
步骤:
5.1.实现处理函数
5.2.使用signal邦定信号与函数
僵死进程回收模型 案例: parentchild.c
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <signal.h> void deal(int s) { int status; wait(&status); printf("回收中.....\n"); sleep(5); printf("回收完毕:%d!\n",WEXITSTATUS(status)); } main() { if(fork()==0) { //child printf("child!\n"); sleep(20); printf("退出!\n"); exit(88); } else { //parent /* int staus; wait(&status); printf("%d\n",WEXITSTATUS(status));//返回状态88 */ signal(17,deal); //while(1) //{ // printf("parent!\n"); // sleep(1); //} sleep(20000); printf("parent!\n"); } }