LINUX.ORG.RU

Непонимаю я как открыть пайп


0

1

Вот стандартный пример из мана:

#include <sys/types.h>
       #include <sys/wait.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <string.h>

       int
       main(int argc, char *argv[])
       {
           int pipefd[2];
           pid_t cpid;
           char buf;

           if (argc != 2) {
               fprintf(stderr, "Usage: %s <string>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (pipe(pipefd) == -1) {
               perror("pipe");
               exit(EXIT_FAILURE);
           }

           cpid = fork();
           if (cpid == -1) {
               perror("fork");
               exit(EXIT_FAILURE);
           }

           if (cpid == 0) {    /* Child reads from pipe */
               close(pipefd[1]);          /* Close unused write end */

               while (read(pipefd[0], &buf, 1) > 0)
                   write(STDOUT_FILENO, &buf, 1);

               write(STDOUT_FILENO, "\n", 1);
               close(pipefd[0]);
               _exit(EXIT_SUCCESS);

           } else {            /* Parent writes argv[1] to pipe */
               close(pipefd[0]);          /* Close unused read end */
               write(pipefd[1], argv[1], strlen(argv[1]));
               close(pipefd[1]);          /* Reader will see EOF */
               wait(NULL);                /* Wait for child */
               exit(EXIT_SUCCESS);
           }
       }

Зачем делать fork? Почему нельзя сделать все в одном процессе?

Вот на примере конкретной задачи: необходимо прочитать файл и инвертировать его биты.

т.е. конвейер будет выглядеть так:

cat ./file | invert_bits | cat

почему не будет работать:

char buf;
pipe(pipefd)
while(read(pipefd[0],sizeof(buf),buf){
   buf ^= 0xff;
   write(read(pipefd[1],sizeof(buf),buf);
}
(код на компиляцию не проверял)

В нижнем примере неявно предполагается, что pipefd[0] и pipefd[1] - это различные пайпы. Но по созданию это не так, все что пишется в один появляется в другом. И каков смысл процессу писать самому себе? Тихо сам с собою я веду беседу?

io ★★ ()
cat ./file | invert_bits | cat

Здесь не нужно открывать никаких пайпов, за тебя всё сделают. Работай просто со страндартными входом и выходом

Gvidon ★★★★ ()
Ответ на: комментарий от fortochkin

а как узнать, передано ли тебе что-то через STDIN?

А зачем? Читаешь себе и читаешь, если данных нет, то блокируешься

Gvidon ★★★★ ()
Ответ на: комментарий от fortochkin

Баш увидев «|» сам сделает тебе конвеер и пробросит через него вывод cat на ввод invert_bits и далее.

loz ★★★★★ ()
Ответ на: комментарий от fortochkin

Вобще обычно проверяют есть ли аргумент - файл, тогда читают из него, как cat, grep, etc, иначе из stdin.

loz ★★★★★ ()
Ответ на: комментарий от fortochkin

т.е. пайпы это только для IPC? конвейер баша тут вообще не причем?

Конвеер баша и есть IPC, просто баш дает тебе удобный интерфейс к нему.

loz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.