为什么我在父进程中使用waitpid,但子进程仍然在父进程之后运行?

时间:2015-01-28 04:20:22

标签: c linux

该计划在

之下
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>

int main(int argc,char **argv)
{
    int fds[2];
    int error=pipe(fds);
    if(error==-1)
    {
        perror("pipe");
        return 1;
    }
    int ret=fork();
    if(ret<0)
    {perror("fork failed");
        return 1;
    }
    else if(ret==0)
    {
        close(fds[0]);
        close(1);
        dup(fds[1]); char *argv[3];
        argv[0]="ls";
        argv[1]="-l";
        argv[2]=NULL;
        execvp(argv[0],argv);
    }
    else
    {   
        int rett=fork();
        if(rett<0)
        {
            perror("fork failed");
            return 1;
        }
        else if(rett==0)
        {
            close(fds[1]);///
            close(0);
            dup(fds[0]);                

            char *argv[2];
            argv[0]="wc";
            argv[1]=NULL;
            execvp(argv[0],argv);       
        }
        else
        {
            waitpid(ret,NULL,7);     /// wait for child process
            waitpid(rett,NULL,7);    //// wait for another child process
            printf("Process %d finished\n",ret);
            printf("Process %d finished\n",rett);
        }
    }
    return 0;
}

下面有结果;为什么printf在“wc”之前执行?

Process 7189 finished
Process 7190 finished
zyy@ubuntu:~$      24     209    1125

1 个答案:

答案 0 :(得分:1)

检查可返回错误的返回值函数。并且不要使用魔法数字而不是正确的标记。

您的waitpid来电实际上并未等待任何流程完成,只会返回错误。你的幻数是多少&#34; 7&#34;意思?这不是文档告诉你的事情。数字7中的一个位是WNOHANG,它告诉waitpid实际上并没有等待孩子们完成。这些标志中的另一个有效,但由于您没有对您的进程执行任何ptrace,因此无用。第三位无效,我们会立即发出waitpid错误。我不会告诉你哪个是因为你根本不应该这样做。阅读手册页。

您遇到的另一个问题是您还需要关闭父进程中的管道。 wc将尝试从管道(在其stdin上)读取数据,直到管道关闭并且它仍然在父管道中保持打开状态。在父项退出后始终打印wc的原因是它是关闭管道的父出口并使wc完成读取。