Unixで1つのパイプを使用してCの親と子を同期する方法はありますか?

StackOverflow https://stackoverflow.com/questions/1422441

  •  07-07-2019
  •  | 
  •  

質問

親と子の両方が書き込みと読み取りの手段に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);
}
役に立ちましたか?

解決

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

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top