wait_pid代码分析

来源:互联网 发布:iosselect.js api 编辑:程序博客网 时间:2024/06/10 03:23

以下代码为网上的一段代码,注释是我自己加的,正确与否,若有异议,坑请赐教

#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <sys/wait.h>void die(const char *msg)//创建失败,则打印错误信息{        perror(msg);        exit(1);//exit(0)代表正常退出,exit(1)代表错误退出}void child2_do(){        printf("In child2: execute 'date'\n");        sleep(5);//睡眠5秒,让其他进程执行        if (execlp("date", "date", NULL) < 0)//终端执行date,打印时间信息         {                perror("child2 execlp");        }}void child1_do(pid_t child2, char *argv){        pid_t pw;        do {                if (*argv == '1')                 {                        pw = waitpid(child2, NULL, 0);                }                else                 {                        pw = waitpid(child2, NULL, WNOHANG);//如果子进程2没有终止,则立即返回                }                if (pw == 0) //pw等于0时说明进程2没有退出,pw不等于0时,说明进程2已经退出                {                        printf("In child1 process:\nThe child2 process has not exited!\n");                        sleep(1);                }        }while (pw == 0);        if (pw == child2) //进程2正常退出时,则在终端显示进程2的pid,并执行pwd        {                printf("Get child2 %d.\n", pw);                sleep(5);                if (execlp("pwd", "pwd", NULL) < 0) {                        perror("child1 execlp");                }        }        else {                printf("error occured!\n");        }}void father_do(pid_t child1, char *argv){        pid_t pw;        do {                if (*argv == '1') {                        pw = waitpid(child1, NULL, 0);                }                else {                        pw = waitpid(child1, NULL, WNOHANG);                }                if (pw == 0) {                        printf("In father process:\nThe child1 process has not exited.\n");                        sleep(1);                }        }while (pw == 0);        if (pw == child1) {                printf("Get child1 %d.\n", pw);                if (execlp("ls", "ls", "-l", NULL) < 0) {                        perror("father execlp");                }        }        else {                printf("error occured!\n");        }}int main(int argc, char *argv[]){        pid_t child1, child2;        if (argc < 3)//如果输入的参数少于3个,则打印如下信息         {                printf("Usage: waitpid [0 1] [0 1]\n");                exit(1);        }        child1 = fork();//创建子进程1        if (child1 < 0) {                die("child1 fork");        }        else if (child1 == 0)         {                child2 = fork();//在子进程child1中再次创建一个子进程child2                if (child2 < 0) {                        die("child2 fork");                }                else if (child2 == 0)                 {                        child2_do();//检验如果创建的child2的pid==0,则执行child2_do();                }                else //检验如果创建的child2的pid!=0,则执行child1_do();                {                        child1_do(child2, argv[1]);//注意:输入参数为进程2的pid,argv[1]                }        }        else//如果是父进程,则执行father_do          {                father_do(child1, argv[2]);        }        return 0;}
终端上执行的结果明天在给出,现在太晚了,要睡了


0 0