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() 创建两个文件描述符,一个用于读取,另一个用于写入。对于双向通信,您需要创建两个管道(四个文件描述符)。

于 2009-09-14T16:45:48.757 回答