1

親と子の両方が書き込みと読み取りに1つのパイプを使用し、一方が書き込みを行った後、もう一方の読み取りのみを使用するとします。それを行う方法はありますか?スリープ機能で試してみましたが、競合状態のため、正しく出力されません。これは私のコードです

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

#define MSGSIZE 16
main ()
{
  int i;
  char *msg = "How are you?";
  char inbuff[MSGSIZE];
  int p[2];
  pid_t ret;
  pipe (p);
  ret = fork ();
  if (ret > 0)
    {
      i = 0;
      while (i < 10)
        {
          write (p[1], msg, MSGSIZE);
          sleep (2);
          read (p[0], inbuff, MSGSIZE);
          printf ("Parent: %s\n", inbuff);
          i++;
        }
    exit(1);
    }
  else
    {
      i = 0;
      while (i < 10)
        {
          sleep (1);
          read (p[0], inbuff, MSGSIZE);
          printf ("Child: %s\n", inbuff);
          write (p[1], "i am fine", strlen ("i am fine"));
          i++;
        }
    }
  exit (0);
}
4

2 に答える 2

6

単一のパイプで双方向同期を行うことはできません。

Unixドメインソケットで双方向同期を行うことができます。

于 2009-09-14T16:42:18.447 に答える
4

pipe()は、読み取り用と書き込み用の2つのファイル記述子を作成します。双方向通信の場合、2つのパイプ(4つのファイル記述子)を作成する必要があります。

于 2009-09-14T16:45:48.757 に答える