僵尸进程和处理方式
来源:互联网 发布:机器视觉算法及应用 编辑:程序博客网 时间:2024/04/19 03:48
#include <stdio.h>#include <stdlib.h>#include <assert.h>int main(){int n;int i;char *s;pid_t pid=fork();assert(pid!=-1); if(pid == 0) { n=2; s="child"; } else { n=5; s="parent"; } for(i=0;i<n;i++) { printf("%d,%s\n",getpid(),s); sleep(1); } return 0;}
在父程序中用于判断子程序是否结束
僵尸进程子进程提前于父进程结束,造成无法清理掉pcb和其他系统消耗造成pid的长时间占用(如上图)
如果父进程异常结束时就成了一个孤儿进程交个pid=1 的init作为父进程进行管理收尸;
三种处理方式
⒈父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起问题父进程在wait处会阻塞如果父进程很忙会造成一系列
#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>#include <assert.h>int main(){signal(SIGCHLD,fun);char *p=NULL;pid_t pid=fork();assert(pid!=-1);int n=0;if(pid==0){p="child";n=10;}else{p="parent";n=20;}int i=0;for(;i<n;i++){printf("%s\n",p);sleep(1);}
if(pid!=0)
{
wait();
}return 0;}
⒉ 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。
第二种代码(只要在父进程收到子进程结束的信号时就去处理该信号)
#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>#include <assert.h>void fun(int sig){printf("sig=%d\n",sig);wait();signal(SIGCHLD,SIG_DFL);//回复默认}int main(){signal(SIGCHLD,fun);char *p=NULL;pid_t pid=fork();assert(pid!=-1);int n=0;if(pid==0){p="child";n=10;}else{p="parent";n=20;}int i=0;for(;i<n;i++){printf("%s\n",p);sleep(1);}return 0;}
⒊ 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。
#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>#include <assert.h>int main(){signal(SIGCHLD,SIG_IGN);char *p=NULL;pid_t pid=fork();assert(pid!=-1);int n=0;if(pid==0){p="child";n=10;}else{p="parent";n=20;}int i=0;for(;i<n;i++){printf("%s\n",p);sleep(1);}return 0;}
还就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收 还要自己做。相比与第一种的好处就是父进程不用等因为子进程在父进程运行时很快就结束了;
#include <stdio.h>
#include <stdlib.h>#include <signal.h>#include <unistd.h>#include <assert.h>int main(){char *p=NULL;pid_t pid=fork();assert(pid!=-1);int n=0;if(pid==0){pid_t pid=fork();if(pid==0){p="child";n=5;}else{printf("%d",getpid());exit(0);//使他提前结束孙进程交给pid=1;}}else{p="parent";n=20;}
wait(NULL);int i=0;for(;i<n;i++){printf("pid=%d,%s\n",getpid(),p);sleep(1);}return 0;}
0 0
- 僵尸进程和处理方式
- 僵尸进程和处理
- 僵尸进程产生和处理
- 僵尸进程以及如何处理僵尸进程
- 处理僵尸进程
- 僵尸进程 处理
- LINUX僵尸进程处理
- 僵尸进程处理
- 如何处理僵尸进程
- 僵尸进程的处理
- 僵尸进程处理
- 如何处理僵尸进程?
- 僵尸进程和如何删除僵尸进程
- 说说Linux中的信号处理和僵尸进程的避免
- 说说Linux中的信号处理和僵尸进程的避免
- 孤儿和僵尸进程
- 【UNIX】僵尸进程的处理
- linux 下处理僵尸进程
- 图解scrollHeight, clientHeight, offsetHeight, scrollTop以及获取方法
- 批量下载搜狗词库
- longest-consecutive-sequence,数组中最长的连续序列
- linux crontab 定时执行脚本
- java中判断两个字符串是否相等的问题
- 僵尸进程和处理方式
- YARN任务pending
- java中集合类HashSet、ArrayList、LinkedList总结
- eclipse配置spark开发环境
- easyUI-textbox 如何自动获取焦点
- 原生JS|数据类型检测,并没你想象的那么简单
- 剑指offer 25. 二叉树中和为某一值的路径
- Qt中的QFileDialog类的几个示范代码
- 关于端口的总结