两次fork防止僵尸进程
来源:互联网 发布:摩亨佐达罗 知乎 编辑:程序博客网 时间:2024/05/18 00:04
1、何谓僵尸进程?
在linux系统中,一个已经终止但父进程尚未对其进行善后处理(释放子进程相关信息占用的资源)的子进程叫做僵尸进程 。子进程结束时,父进程调用pid_t wait(int *statloc)或者pid_t waitpid(pid_t pid,int *statloc,int options)获取内核中为子进程保存的信息(进程id,终止状态)。
2、僵尸进程避免分析
创建进程时,子进程的终止状态要返回给父进程,但调用fork函数时候,若父进程比子进程提前结束,则由init进程领养:在一个进程终止时候,内核逐个 检查所有活动进程,判断它是否是被终止进程的子进程,如果是,则将该进程父进程的ID更改为1,这样,每个进程都有父进程,init 进程只要检测有子进程终止就会调用wait或waitpid释放资源,防止僵尸进程。
在linux系统中,一个已经终止但父进程尚未对其进行善后处理(释放子进程相关信息占用的资源)的子进程叫做僵尸进程 。子进程结束时,父进程调用pid_t wait(int *statloc)或者pid_t waitpid(pid_t pid,int *statloc,int options)获取内核中为子进程保存的信息(进程id,终止状态)。
2、僵尸进程避免分析
创建进程时,子进程的终止状态要返回给父进程,但调用fork函数时候,若父进程比子进程提前结束,则由init进程领养:在一个进程终止时候,内核逐个 检查所有活动进程,判断它是否是被终止进程的子进程,如果是,则将该进程父进程的ID更改为1,这样,每个进程都有父进程,init 进程只要检测有子进程终止就会调用wait或waitpid释放资源,防止僵尸进程。
3、解决办法:调用两次fork避免僵尸进程
#include "apue.h"#include <sys/wait.h>int main(void){ pid_t pid; if ((pid = fork()) < 0) { err_sys("fork error"); } else if (pid == 0) // 第一个子进程 { if ((pid = fork()) < 0) err_sys("fork error"); else if (pid > 0) exit(0); //第二个子进程的父进程终止(第一个子进程) //这里是第二个子进程(孤儿进程),其父进程已经变成了init进程,当亲生父进程在上面调用exit()终止后,在此处继续执行,当第二个子进程终止的时候,父进程init会获取其状态,从而避免僵尸进程嗯。 sleep(2); //保证父进程优先运行(第一个子进程) printf("second child, parent pid = %d/n", getppid()); //获取父进程ID(即init ID,为1) exit(0); //第二个子进程终止 } if (waitpid(pid, NULL, 0) != pid) //等待第一个子进程 err_sys("waitpid error"); printf("i am the parents of your parents/n"); //这里是继续执行原始父进程(第一个父进程),且知道不是第二个子进程的父进程 exit(0); //第一个父进程终止}
1 0
- 两次fork防止僵尸进程
- 如何防止僵尸进程的产生之fork两次
- fork两次解决僵尸进程
- fork两次如何避免僵尸进程
- fork两次如何避免僵尸进程
- fork两次如何避免僵尸进程收藏
- fork两次如何避免僵尸进程收藏
- fork两次如何避免僵尸进程
- fork两次如何避免僵尸进程收藏
- fork两次如何避免僵尸进程
- fork两次如何避免僵尸进程
- fork两次如何避免僵尸进程收藏
- 调用 fork 两次避免僵尸进程
- fork两次如何避免僵尸进程
- 【apue学习心得】两次fork避免僵尸进程
- Unix通过fork两次避免僵尸进程
- fork两次如何避免僵尸进程收藏
- 通过两次fork避免产生僵尸进程
- 打印流 PrintStream and PrintWriter
- 我的第四课:jQuery 选择器
- servlet学习
- popupwindow
- 黑马程序员-第十二天(StringBuffer/StringBuilder)
- 两次fork防止僵尸进程
- ObjectInputStram 和ObjectOutputStream对象的持久化操作
- emacs -2014
- 使用gdb调试so的thumb时报错
- 黑马程序员-第十三天(基本数据类型包装类)
- 分割文件与合并文件
- 为什么编译后总会有call of nonfunction?
- Cocos2dx 3.0 过渡篇(十四)用touch拖动女主打败小三!
- HDU 1879 畅通工程(最小生成树)