Unixで1つのパイプを使用してCの親と子を同期する方法はありますか?
-
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ドメインソケットで双方向の同期を行うことができます。
所属していません StackOverflow