Два канала в программе c и второй не работает должным образом

В настоящее время я делаю некоторые тесты с использованием каналов и вилок в C. Я пытаюсь скопировать поведение этой команды оболочки в моей программе:

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?

0 ответов

Другие вопросы по тегам