Использование системного вызова pipe ()

, я пытался использовать системный вызов pipe () для создания оболочки, поддерживающей конвейер (с произвольным числом команд).

К сожалению, мне не повезло с использованием pipe (). Потратив несколько дней на изучение различных онлайн-ресурсов, я решил составить упрощенную программу, которая будет иметь тот же эффект, что и выполнение ls | sort , чтобы увидеть, смогу ли я даже заставить работать конвейер для двух дочерних процессов, родных и близких. Вот код:

#include <sys/wait.h>
#include <unistd.h>

void run(char *cmd) {
   char *args[2];
   args[0] = cmd;
   args[1] = NULL;

   execvp(cmd, args);
}

int main(void) {
    int filedes[2];
    pipe(filedes);

    pid_t pid_a, pid_b;

    if (!(pid_a = fork())) {
        dup2(filedes[1], 1);
        run("ls");
    }

    if (!(pid_b = fork())) {
        dup2(filedes[0], 0);
        run("sort");
    }

    waitpid(pid_a, NULL, 0);
    waitpid(pid_b, NULL, 0);

    return 0;
}

Канал создается в родительском элементе, и я знаю, что после вызова execvp () каждый дочерний процесс наследует дескрипторы файлов, которые pipe () создает в родительском. Для процесса ls я использую dup2 () для перенаправления его стандартного вывода (1) на конец записи канала, а для процесса sort стандарт в (0 ) перенаправляется в конец канала для чтения.

Наконец, я жду завершения обоих процессов перед выходом.

Моя интуиция подсказывает мне, что это должно сработать, но это не так!

Есть предложения?

5
задан Servy 18 September 2012 в 20:58
поделиться