c程序中的两个管道和第二个管道不能按预期工作

时间:2015-05-01 13:43:07

标签: c unix pipe fork dup2

我目前正在用C中的管道和叉子进行一些测试。 我试图在我的程序中复制此shell命令的行为:

cat < test | wc

测试文件只包含一些文字。 这是我的程序代码:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/wait.h>
#include <stdlib.h>

// cat < test | wc
int         main(int ac, char **av)
{
    int     p1[2];
    int     pid1;

    printf("\nBegin of the test...\n");
    if (pipe(p1) == -1)
    {
        perror("Pipe1");
        exit(1);
    }
    else
    {
        pid1 = fork();
        if (pid1 > 0)
        {
            int     p2[2];
            int     pid2;

            close(p1[0]);
            if (pipe(p2) == -1)
            {
                perror("Pipe1");
                exit(1);
            }
            else
            {
                pid2 = fork();
                if (pid2 > 0)
                {
                    int             pid3;

                    close(p1[1]);
                    pid3 = fork();
                    if (pid3 > 0)
                    {
                        close(p2[1]);
                        wait(0);
                        printf("All is done !\n");
                    }
                    else if (pid3 == 0)
                    {
                        close(p2[1]);
                        dup2(p2[0], 0);
                        execve("/usr/bin/wc", av, NULL);
                    }
                    wait(0);
                }
                else if (pid2 == 0)
                {
                    int     fd;
                    char    buffer[20];
                    int     ret;

                    close(p2[0]);
                    dup2(p2[1], 1);
                    fd = open("test", O_RDONLY);
                    if (fd >= 0)
                    {
                        while ((ret = read(fd, buffer, 20)) > 0)
                            write(p1[1], buffer, ret);
                        close(fd);
                        close(p1[1]);
                    }
                    else
                    {
                        perror("Open file error");
                        exit(1);
                    }
                    close(p1[1]);
                    exit(1);
                }
            }
            wait(0);
        }
        else if (pid1 == 0)
        {
            close(p1[1]);
            dup2(p1[0], 0);
            execve("/bin/cat", av, NULL);   
        }
    }
    printf("\nEnd of the program.\n");
    return (1);
}

输出结果为:

Begin of the test...
All is done !
Content of the test file
       0       0       0

End of the program.

有人可以向我解释为什么cat输出没有通过管道2重定向到wc?

0 个答案:

没有答案