解决多进程中使用wait无法避免僵尸进程的方案
来源:互联网 发布:上海淘宝模特兼职招聘 编辑:程序博客网 时间:2024/05/16 06:00
我想到了有几个方案,大致如下:
一是用信号量,由于wait是阻塞函数,所以这里用waitpid,并且设置参数NOWHANG,这样waitpid就不是阻塞的了。
具体实现如下:
int main() { int count=0; int i; pid_t pid; signal(SIGCHLD, wait4children); for(i=0; i<100; i++) { pid = fork(); if(pid == 0){ count++; break; } } if(pid>0) { printf("press Enter to exit..."); getchar(); } return 0;}
void func_waitpid(int signo) { pid_t pid; int stat; while( (pid = waitpid(-1, &stat, WNOHANG)) > 0 ) {//如果使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。 printf( "child %d exit\n", pid ); count--; if(count==0) { break; } } return;}
还有一种实现,不调用wait,在父进程中设置条件,未满足条件的时候pause父进程。
int iChildCount = 0; int ProcChildEnd(int iSigNo); int main(){ pid_t pid; int i = 10; signal(SIGCHLD, ProcChildEnd); //take fork 10 child processes for example, you can fork any amount child processes as you want while(i--) { pid = fork(); if (pid == 0) { //child; } else if (pid > 0) { iChildCount++; } else { //error; } } //block untill all child process have been ended while(iChildCount > 0) { pause(); } //All child have been ended, start to do anything you want return 0;} int ProcChildEnd(int signo){ iChildCount--; return 0;}
0 0
- 解决多进程中使用wait无法避免僵尸进程的方案
- 僵尸进程的避免
- 僵尸进程的避免 .
- 僵尸进程的产生和避免,以及wait,waitpid的使用
- 使用waitpid避免僵尸进程
- Linux进程实践(4) --wait避免僵尸进程
- Linux进程实践(4) --wait避免僵尸进程
- Linux进程实践(4) --wait避免僵尸进程
- Linux进程实践(4) --wait避免僵尸进程
- socket06---僵尸进程的避免
- Linux下多进程避免僵尸进程的方法
- 僵尸进程 wait() waitpid()
- 僵尸进程 wait() waitpid()
- 僵尸进程 wait() waitpid()
- wait WNOHANG 僵尸进程
- 僵尸进程 wait waitpid
- 僵尸进程及其避免
- 避免僵尸进程
- Android高手进阶教程(三)之----Android 中自定义View的应用.
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- be a geek-从零开始学编程三:无处不在的javascript 2
- 如果一切需要重学,2014年应该学哪些技术?
- C++ int 转换成string
- 解决多进程中使用wait无法避免僵尸进程的方案
- MySQL 中MyISAM 表级锁和InnoDB 行级锁的实现特点
- 黑马程序员03——C语言之文件操作模式
- Objective-C之 UIButton 和 UIImageView 的区别
- UNICODE和ANSI以及MBCS的问题
- 通过构造Hash冲突实现各种语言的拒绝服务攻击
- 百度贴吧(WEB)产品分析
- 市委组织部考核项目--"加载全部项"
- win7 系统下配置 java 环境变量———细节决定成败,一个逗号都不能忽略!