pipe, fork, how it is possible that program runs if and else of the same condition

别来无恙 提交于 2019-12-12 02:28:40

问题


Program runs once and it both throws data to the pipe and gets it out in the same condition that should be mutually exclusive (in if and else). What I don't get here? How does that work? I have no experience with this kind of programming.

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

Read characters from the pipe and echo them to stdout.

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

Write some random text to the pipe.

     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:


Right after the line that says:

pid = fork();

You no longer have one program, but two distinct ones (when fork succeeds).

It's not the same program that runs both. In the child process, fork returns 0, but in the parent it returns the child PID.

The parent runs one branch of the if/else construct, the child runs another. (And a third is run, in the parent only, if fork fails.)



来源:https://stackoverflow.com/questions/9862867/pipe-fork-how-it-is-possible-that-program-runs-if-and-else-of-the-same-conditi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!