使用C ..实现管道(“|”)(使用叉子)

时间:2010-02-03 11:12:29

标签: c gcc pipe fork

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char **argv)
{
    int fd[2];
    pid_t childpid;
    pipe(fd);
    childpid=fork();
    if (childpid == -1)
    {
        perror("Error forking...");
        exit(1);
    }
    if (childpid)   /*parent proces*/   //grep .c
    {
        wait(&childpid);        //waits till the child send output to pipe
        close(fd[1]);
        close(0);       //stdin closed
        dup2(fd[0],0);
        execlp(argv[2],argv[2],argv[3],NULL);

    }
    if (childpid==0)  //ls
    {
        close(fd[0]);   /*Closes read side of pipe*/
        close(1);       //STDOUT closed
        dup2(fd[1],1);
        execl(argv[1],NULL);
    }
    return 0;
}

如果我将命令行参数命名为“ls grep .c”,我应该显示所有“.c”文件。

伪代码: - 我的孩子流程将运行“ls”&amp;父进程将运行“grep .c”.. 父进程等待子进程完成,以便子进程写入管道。

试运行: -

bash-3.1$ ls | grep .c
1.c
hello.c
bash-3.1$ ./a.out ls grep .c
bash-3.1$

为什么会这样?

3 个答案:

答案 0 :(得分:8)

一个简单的错误:您的execl电话实际上应该是execlp。此外,您可以删除waitclose语句。然后,您应该检查execlp的错误代码。

答案 1 :(得分:1)

还有一件事,close(0)close(1)是不必要的,dup2()函数会自动为您执行此操作。

答案 2 :(得分:1)

请参阅以下问题中的答案,了解实施管道的代码。

Pipe implementation in Linux using c