Труба в оболочке C UNIX - PullRequest
       14

Труба в оболочке C UNIX

3 голосов
/ 20 октября 2011

Я не очень уверен, как создать канал между двумя дочерними процессами. Вот как я это сделал:

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», выполняется неправильно), однако, если я удаляю второй дочерний процесс, программа работает нормально (не включая pipe, просто простой fork: ls, ls -l, ps и т. д.).

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Лучший ответ, который я могу дать, - Руководство Биджа по Unix IPC .

(загляните в раздел 4.3, где он приводит пример, очень похожий на вопрос, который вы задали ...)

0 голосов
/ 20 октября 2011

В настройке дочернего процесса 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.

...