c - 在C中实现管道

标签 c shell fork pipe wait

我尝试用 C 实现管道,但遇到了一些问题:

这是我的功能:

void commandeTube(char * c1, char * c2) {
    int c1toc2[2];
    int c2toPere[2];
    pid_t pidc1, pidc2;
    if(pipe(c1toc2) && pipe(c2toPere)) {
        perror("Erreur");
        errno=0;
        return ;
    }
    pidc2 = fork();
    if(pidc2 != 0) {
        pidc1=fork();
        if(pidc1!=0) {

            int status;
            waitpid(pidc1,&status,0);
            char buffer[1024]={0};
            int n;
            while((n=read(c2toPere[0],buffer,1024))==1024)
                write(1,buffer,n);
            write(1,buffer,n);


        }
        else if(pidc1==0){
            write(STDOUT_FILENO,"C1\n",3);
            /*On est dans C1*/
            close(c1toc2[0]);
            dup2(c1toc2[1],1);
            char * argc1[10];
            constructTab(c1,argc1);
            write(STDOUT_FILENO,"C1 exe\n",7);
            if(execvp(argc1[0],argc1)==-1) {
                perror("Erreur execlp");
                errno=0;
                return;
            }
            freeTab(argc1);
            write(STDOUT_FILENO,"C1 fin\n",7);
        } 

    }
    else {
            /*C2*/
            write(STDOUT_FILENO,"C2\n",3);
            int stat;
            char * argc2[10];
            constructTab(c2,argc2);
            close(c1toc2[1]);
            /*close(c2toPere[0]);*/
            dup2(c1toc2[0],STDIN_FILENO);
            /*dup2(c2toPere[1],1);*/
            write(STDOUT_FILENO,"C2 exe\n",7);
            if(execvp(argc2[0],argc2)==-1) {
                perror("Erreur execlp");
                errno=0;
                return;
            }
            freeTab(argc2);
            write(STDOUT_FILENO,"C2 fin\n",7);

    }
}

例如,如果我有这个:

cmd1 | cmd2

主进程创建 2 个子进程,其中一个为 cmd1另一个为 cmd2cmd1的输出被重定向到cmd2的输入。我的问题是cmd2cmd1之前执行,所以如果我输入:

ls | wc

例如,wc 将首先启动。这就是我在 shell 中看到的内容:

C2
C1
C2 exe

如何在执行C2之前完全执行C1?早些时候,我尝试使用 waitpid(c1,...,..); 使 c1 成为 c2 的子级。但我得到了同样的结果。

最佳答案

如果您希望将第一个命令的输出重定向到第二个命令的输入,您可以考虑阅读 man 2 pipeline,那里有一个很好的示例,应该可以让您走上正轨。

http://linux.die.net/man/2/pipe

关于c - 在C中实现管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16343122/

相关文章:

ruby-on-rails - 如何在 Rake 任务中执行命令?

C - 使用 fork() 创建 3 个子进程

c - getaddrinfo 不一致的行为

c - 可变长度参数列表是如何实现的?

c - 为什么函数存在于.o文件中,但不存在于.so文件中?

shell - 我的 AWS CLI 无法使用 sudo

C 堆栈帧跟踪

c - Unix C Shell - 作业控制问题!

c - 使用 Fork() 将整数传递给子进程和父进程的 Linux 系统调用问题

c - 字符串存储到共享内存后无法正常显示