孤儿进程与僵死进程示例介绍
发布时间:2021-11-12 12:46:40 所属栏目:教程 来源:互联网
导读:孤儿进程: 因父亲进程先退出而导致一个子进程被 init 进程收养的进程为孤儿进程,即孤儿进程的父亲更改为 init 进程,该进程在孤儿进程退出后回收它的内核空间资源。 僵死进程: 进程已经退出,但它的父亲进程还没有回收内核资源的进程为僵死进程,即该进程
孤儿进程: 因父亲进程先退出而导致一个子进程被 init 进程收养的进程为孤儿进程,即孤儿进程的父亲更改为 init 进程,该进程在孤儿进程退出后回收它的内核空间资源。 僵死进程: 进程已经退出,但它的父亲进程还没有回收内核资源的进程为僵死进程,即该进程在内核空间的 PCB(进程控制块) 没有释放。 1.以下是一个孤儿进程的示例程序,在此程序中,让父进程先退出,然后子进程再次输出自己的父亲进程号: #include <stdio.h> #include <unistd.h> int main() { int pid; if((pid = fork()) == -1) perror("fork Err"); else if(!pid){ printf("Child: pid : %d, ppid : %d n", getpid(), getppid()); sleep(2); printf("Child: pid : %d, ppid : %d n", getpid(), getppid()); } else{ sleep(1); printf("Parent: pid : %d, ppid : %d n", getpid(), getppid()); } return 0; } 运行结果如下: 孤儿进程与僵死进程示例讲解 从结果来看,子进程的父进程前后发生了变化。 2.以下是僵死进程的示例程序,在此程序中,父进程让子进程退出但不处理,然后父进程调用 system 函数列出当前前台进程信息,代码如下: #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { int pid; if((pid = fork()) == -1) perror("fork err"); else if(!pid){ exit(0); } sleep(1); system("ps"); return 0; } 运行结果如下: 孤儿进程与僵死进程示例讲解 红框的进程即为僵死状态。 怎样来清除僵尸进程: 1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。 2.把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。 wait()与waitpid() wait(): 调用 wait() 函数的父亲进程将阻塞式等待该进程的任意一个子进程结束后,回收该子进程的内核进程资源。 waitpid(): waitpid()函数可以用来等待指定子进程(指定PID的子进程)结束。 (编辑:东莞站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |