wait如何处理多进程(多个子进程)

来源:互联网 发布:剑三藏剑男神捏脸数据 编辑:程序博客网 时间:2024/05/28 05:19
#include <stdio.h>#include <stdlib.h>#include <unistd.h>/* linux 系统调用 wait() * 当用fork()创建子进程,子进程在退出后父进程没有调用wait * 就会产生僵尸进程. * * 下面是用fork循环创建多个子进程,在父进程里调用一次wait * 只能回收一个子进程. * * 下面展示如何用wait()回收多个子进程. * * */int main(void){    int procnum = 0, loopnum = 0;    int i = 0, j = 0;    pid_t fpid;    printf("procnum = ");    scanf("%d", &procnum);    printf("loopnum = ");    scanf("%d", &loopnum);    for (i = 0; i < procnum; i++) {         fpid = fork();        //printf("child pid: %d\n", getpid());        if (fpid == 0){            for (j = 0; j < loopnum; j++) {                printf("loop %d\n", j);             }            exit(0);        }    }    wait(NULL);  //调用一次,只能回收一个子进程    sleep(1000);    printf("parrent pid: %d\n", getpid());    return 0;}

运行截图
从截图中可以看到,产生了五个进程,调用一次wait只能回收一个子进程,还有四个僵尸进程,如何回收所有子进程呢,程序改进如下:

#include <stdio.h>#include <stdlib.h>#include <unistd.h>/* linux 系统调用 wait() * 当用fork()创建子进程,子进程在退出后父进程没有调用wait * 就会产生僵尸进程. * * 下面是用fork循环创建多个子进程,在父进程里调用一次wait * 只能回收一个子进程. * * 下面展示如何用wait()回收多个子进程. * * */int main(void){    int procnum = 0, loopnum = 0;    int i = 0, j = 0;    int ret = 0;    pid_t fpid;    printf("procnum = ");    scanf("%d", &procnum);    printf("loopnum = ");    scanf("%d", &loopnum);    for (i = 0; i < procnum; i++) {         fpid = fork();        //printf("child pid: %d\n", getpid());        if (fpid == 0){            for (j = 0; j < loopnum; j++) {                printf("loop %d\n", j);             }            exit(0);        }    }    // 检测到所有子进程都退出,父进程才退出    while (1) {        ret = wait(NULL);        if (ret == -1) {            if (errno == EINTR) {    // 返回值为-1的时候有两种情况,一种是没有子进程了,还有一种是被中断了                continue;            }            break;        }    }    printf("parrent pid: %d\n", getpid());    return 0;}

这里写图片描述
可以看到,已经没有僵尸进程了..

0 0
原创粉丝点击