прикованные трубы в Linux с помощью pipe () - PullRequest
2 голосов
/ 28 ноября 2011

Я знаю, как создать один канал в Linux с C, который выглядит как cat /tmp/txt |grep foo, но у меня есть проблемы с реализацией нескольких связанных каналов, таких как cat /tmp/1.txt | uniq -c | sort. Как сделать это с C, используя pipe() в Linux?

ОБНОВЛЕНИЕ: Я понял это. Вот код, если у кого-нибудь когда-нибудь возникнет тот же вопрос:

enum PIPES {
    READ, WRITE
};


 int filedes[2];
    int filedes2[2];
    pipe(filedes);
    pipe(filedes2); 

    pid_t pid = fork();
    if (pid == 0) {
        dup2(filedes[WRITE], 1);
    char *argv[] = {"cat", "/tmp/1.txt", NULL};
        execv("/bin/cat", argv); 
        exit(0);
    } 
    else {
        close(filedes[1]);
    }

    pid = fork();
    if (pid == 0) {
    dup2(filedes[READ], 0);
    dup2(filedes2[WRITE], 1);
        char *argv[] = {"uniq", "-c", NULL};
        execv("/usr/bin/uniq", argv);       
    }
    else {
        close(filedes2[1]);
    }

    pid = fork();
    if (pid == 0) {
        dup2(filedes2[READ], 0);
        char *argv1[] = {"sort", NULL};
            execv("/usr/bin/sort", argv1);
    }

    waitpid(pid);

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Вы получаете пару файловых дескрипторов - давайте назовем их a и b. Последующий вызов pipe дает вам файловые дескрипторы c и d.

Итак, вы подключаете b к c, чтобы связать эти два процесса. Создайте еще одну пару файловых дескрипторов и подключите, например, d к e и т. Д.

1 голос
/ 28 ноября 2011

Канал имеет два конца (чтение и запись), а pipe () соответственно помещает два файловых дескриптора в указанный вами массив.Первый - конец чтения, а второй - конец записи.

Итак, в вашем примере вы создали бы два канала и:

  • подключили стандартный вывод cat к концу записи первого канала,
  • подключите стандартный вход uniq к концу чтения первого канала,
  • подключите стандартный вывод uniq кконец второй трубы записать,
  • подключить стандартный вход sort к концу чтения второй трубы.
...