Трубный ввод C на вилку - PullRequest
       6

Трубный ввод C на вилку

0 голосов
/ 05 декабря 2018

Я пытаюсь написать программу на C, которая выполняет ls | wc с использованием pipe и fork, но я не могу понять, что не так с моим кодом.Когда я запускаю приведенный ниже код, ничего не возвращается.

int main() {
    pid_t p1, p2;
    int fd1[2];

    pipe(fd1);

    p1 = fork();
    if (p1 == 0) {
        close(STDOUT_FILENO);
        dup2(fd1[1], STDOUT_FILENO);
        close(fd1[0]);
        execlp("ls", "ls", (char *)NULL);
    } else {
        p2 = fork();

        if (p2 == 0) {
            dup2(fd1[0], STDIN_FILENO);
            close(fd1[0]);
            close(fd1[1]);

            execlp("wc", "wc", (char *)NULL);
        } else {
            waitpid(p2, 0, WUNTRACED);
            waitpid(p1, 0, WUNTRACED);
        }
    }

    return 0;
}

1 Ответ

0 голосов
/ 05 декабря 2018

Вы не четко объяснили, что делает эта программа, что вы считаете неправильным.Однако, когда я запускаю эту программу самостоятельно (после добавления соответствующих заголовков - в будущем, пожалуйста, не оставляйте их вне вашего вопроса), она зависает, пока я не нажму control-C.Я собираюсь предположить, что это то, что вы не хотели, и что вы сделали хотите, чтобы он напечатал вывод wc и затем завершил работу.

Программа зависает, потому что fd1[1] все еще открыт в родительском процессе в тот момент, когда он вызывает wait.wc не получит индикацию EOF, пока все файловых дескрипторов, относящихся к стороне записи канала, не будут закрыты.Но родительский процесс не собирается закрывать сторону записи канала до тех пор, пока не выйдут оба его дочерних процесса, а wc не будет выходить до тех пор, пока не получит EOF, поэтому у вас есть тупик.

Вам нужно добавить close(fd1[1]) на родительской стороне первого if, непосредственно перед p2 = fork().Этого достаточно, чтобы выйти из тупика.Вы должны также добавить close(fd1[0]) на родительской стороне second if, непосредственно перед waitpid вызовами.И вы также должны проверить все операции на наличие ошибок.

...