1

子プロセスと親プロセス間の双方向通信を含むシナリオを実装しました。子プロセスは、execvp を使用して別の C プログラム (XYZ など) を起動します。親はパイプ 1 の一方の端にデータを書き込み、パイプ 1 のもう一方の端は子の stdin に複製されます。そのため、子はこのデータを読み取り、いくつかの操作を実行して、データを stdout に書き戻します。この stdout はパイプ 2 の書き込み側に複製され、親はパイプ 2 の読み取り側から読み取ります。外部プログラム XYZ は変更されません。従うべきシーケンスは次のとおりです。

1) 親がパイプ 1 にデータを書き込む 2) 子がパイプ 1 の複製された端 (stdin) からデータを読み取る 3) 子がデータにいくつかの変更を加え、パイプ 2 の端を読み取るために複製される標準出力にデータを書き戻す 4) 親がデータを読み取ろうとするpipe2 の読み取り側から。

上記のシナリオは n 回繰り返すことができます。

上記のシナリオの例 1) 親が 1 を書き込む 2) 子が 1 を読み取って変更を行い、(変更後) 1 を標準出力に書き込む 3) 親がこのデータを読み取って出力する 4) 印刷後、親が 2 を標準入力に書き込む 5 ) 上記のように続きます.....

私が直面している問題は、親がパイプ 2 の読み取り側からデータを読み取ることができないことです。その文字通りぶらぶらしています。

Imp 注: データを再度書き込む必要があるため、pipe1 の書き込みハンドルを閉じていません。ハンドルを閉じると、パイプでサポートされていないため、再度開くことができません。

コードは以下のとおりです

void Child_write  (pid_t Handle);
void Parent_write (pid_t Handle, char c);
void Child_read  (pid_t Handle);
void Parent_read (pid_t Handle);

void main()
{

  pid_t Pid;
  int   writepipe[2],readpipe [2];  

  pipe(readpipe);               /* Create two file descriptors  */
  pipe(writepipe);              /* Create two file descriptors  */

  Pid = fork();

  if (Pid == 0)         
  {
     close(writepipe[1]);               /* closing writepipe's write end */
     dup2(writepipe[0],0); close(writepipe[0]);     /* duplicating writepipe's read    end to stdin*/
     close(readpipe[0]);                /* closing readpipe's read end*/
     dup2(readpipe[1],1);  close(readpipe[1]);      /* duplicating readpipe's write end to stdout*/    
     Child_read(writepipe[0]);              /* reading data from write pipe read end and then duplicating*/

  }
  else                  
  {
     close(writepipe[0]);               /* closing writepipe's read end */
     Parent_write(writepipe[1],'1');            /* pupming data to the writepipe */
     close(readpipe[1]);                /* closing the readpipes write end */
     Parent_read(readpipe[0]);              /* reading the data which is pumped into readpipe */
     //Parent_write(writepipe[1],'2');          /* pupming data to the writepipe */
     //Parent_read(readpipe[0]);

     //Parent_write(writepipe[1],'3');
     //Parent_read(readpipe[0]);
     puts("***** End of parent process*****");
  }
}

void Child_read(pid_t handle)
{
   static char* command = "./stdoutput";
   execvp(command, NULL);
}

void Parent_write(pid_t handle, char c)
{
   char Buff[] = {'\n','\n'};
   Buff[0] = c;
   int n_written= write(handle, Buff, strlen(Buff)+1);

   printf("write function has written %d no of bytes and the data written is %s",n_written,Buff);

   //close(handle);
}

void Parent_read(pid_t handle)
{
    printf("PARENT PROCESS: In Parent_read function\n");
    int i=0;
    int bytes_read = 0;
    char buffer[1024]= {'\0'};
    while (read(handle, buffer, sizeof(buffer)) > 0)
    {
        printf("PARENT PROCESS:: In while loop\n");
        printf("The character/string read from readend of readpipe (stdout) is %s",buffer);
    }
    close(handle);
}

外部プログラムは以下の通り

void printing()
{
  int c;
  do
    {
        c = getchar();
        printf("%c",c);
    } while ((c != EOF) && (c != '\n'));
}

void main()
{
  printing();
  printing();
}

私を助けてください !!!!!!!!!

4

2 に答える 2

-1

確かに、Jerry Coffin がコメントしたように、使用する必要がありますpopen(一部のシステムにはp2open、1 つのイン、別のアウトの双方向パイピング用もあります)。

どうしても自分でやりたい場合は、poll (またはおそらく古いselect ) のような多重化システム コールの使用を強く検討する必要があります。次に、どのファイル記述子を読み書きできるかをテストし、それに応じて動作させることができます。

于 2012-04-04T05:29:03.600 に答える