2012-03-25 8 views
0

プログラムの実行され、一度実行され、それが両方のパイプにデータをスローし、(相互に排他的である必要があり、同じ条件でそれを取得することであれば、他で)。 ここには何がありますか? どのように機能しますか? 私はこの種のプログラミングの経験がありません。パイプは、フォークは、それが可能であるどのようにプログラムがあれば、他に同じ条件

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

パイプから文字を読み込み、stdoutにエコーします。

 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; 
     } 
    } 

答えて

4

右という行の後:

pid = fork(); 

あなたはもはや一つのプログラムが、二つの異なるものを(forkが成功した場合)がありません。

これは、両方を実行しているのと同じプログラムではありません。子プロセスでは、forkは0を返しますが、親では子PIDを返します。

親は、子供が別のものを実行し、if/elseコンストラクトの一方の分岐が実行されます。 (そしてforkが失敗した場合に第三は、親だけで、実行されます。)

+0

どのこのコードの一部は、私が一緒に実行している必要がありますどのように多くのプログラムを決定しますか? 'int mypipe [2];'を 'int mypipe [3];に変更すれば十分ですか? – user1291641

+0

いいえ、まったくありません。 'pipe'はプロセスを作成せず、' fork'はプロセスを作成します。あなたは 'fork'を呼び出すたびに新しいプロセスを取得します。非常に注意してドキュメントを読んでください。ループ内で 'fork'を呼び出すことになったり、親の中でどのコードを実行しているかを気にかけなければ、" fork bomb "になるかもしれません。 (それについても読んでください) – Mat

関連する問題