труба, вилка, как это возможно, что программа работает, если и в других условиях - PullRequest
0 голосов
/ 25 марта 2012

Программа запускается один раз, и она выбрасывает данные в канал и выводит их в том же состоянии, которое должно быть взаимоисключающим (в if и else).Что я не понимаю здесь?Как это работает?У меня нет опыта работы с этим типом программирования.

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

Чтение символов из канала и вывод их на стандартный вывод.

     void
     read_from_pipe (int file)
     {
       FILE *stream;
       int c;
       stream = fdopen (file, "r");
       while ((c = fgetc (stream)) != EOF)
         putchar (c);
       fclose (stream);
     }

Запись произвольного текста в канал.

     void
     write_to_pipe (int file)
     {
       FILE *stream;
       stream = fdopen (file, "w");
       fprintf (stream, "hello, world!\n");
       fprintf (stream, "goodbye, world!\n");
       fclose (stream);
     }

     int
     main (void)
     {
       pid_t pid;
       int mypipe[2];

       /* Create the pipe. */
       if (pipe (mypipe))
         {
           fprintf (stderr, "Pipe failed.\n");
           return EXIT_FAILURE;
         }

       /* Create the child process. */
       pid = fork ();
       if (pid == (pid_t) 0)
         {
           /* This is the child process.
              Close other end first. */
           close (mypipe[1]);
           read_from_pipe (mypipe[0]);
           return EXIT_SUCCESS;
         }
       else if (pid < (pid_t) 0)
         {
           /* The fork failed. */
           fprintf (stderr, "Fork failed.\n");
           return EXIT_FAILURE;
         }
       else
         {
           /* This is the parent process.
              Close other end first. */
           close (mypipe[0]);
           write_to_pipe (mypipe[1]);
           return EXIT_SUCCESS;
         }
     }

1 Ответ

5 голосов
/ 25 марта 2012

Сразу после строки, которая говорит:

pid = fork();

У вас больше нет одной программы, а есть две разные (когда fork успешно).

Это не та же самая программа, которая запускает оба. В дочернем процессе fork возвращает 0, а в родительском - дочерний PID.

Родитель запускает одну ветвь конструкции if / else, потомок запускает другую. (И третий запускается, только в родительском, если fork не удается.)

...