在C语言UNIX shell中使用管道

3

我不是很确定如何在两个子进程之间创建一个管道。我是这样做的:

pipe(&fd[0]);                               //Create a pipe
proc1 = fork();

//Child process 1
if (proc1 ==  0)
{
    close(fd[0]);                           //process1 doenst need to read from pipe
    close(STD_INPUT);                       //prepare for output
    dup(fd[1]);                             //Standard output = fd[1]
    close(fd[1]);
    execvp(parameter[0], parameter);        //Execute the process
}

else
{
     proc2 = fork();
    if (proc2 == 0)
    {
        close(fd[1]);
        close(STD_OUTPUT);
        dup(fd[0]);
        close(fd[0]);
        execvp(parameter2[0], parameter2);
    }
        //Parent process
    else
    {
    waitpid(-1, &status, 0);            //Wait for the child to be done
    }
}

我试图将一个子进程的输出重定向到另一个子进程,但我认为我在第二个子进程中使用了管道的错误,因为当我运行带有第二个子进程的程序时,会出现不正确的结果(像执行“ls”这样的简单操作会出错),但是,如果我删除第二个子进程,程序就可以正常运行(不包括管道,只有简单的fork: ls,ls -l,ps等)。
2个回答

2
我能给出的最好答案是Beej's Guide to Unix IPC。(在第4.3节中查看,他给出了一个非常类似于你所问问题的例子...)

0
在子进程1的设置中,close(STD_INPUT); dup(fd[1]);会将fd[1]复制到最低可用描述符,即0(STD_INPUT),而不是1(STD_OUTPUT)。难道你不想关闭STD_OUTPUT吗?此外,我建议使用dup2(fd[1], STD_OUTPUT)代替这个序列;它会做你想要的事情,而且更清晰明了。
同样,子进程2在这里使用了STD_OUTPUT,而你可能想要使用STD_INPUT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接