Есть ли способ синхронизации родителя и потомка в C, используя один канал в Unix? - PullRequest
1 голос
/ 14 сентября 2009

Предположим, что и родитель, и потомок используют один канал для записи и чтения, когда один пишет, тогда только другой читает, иначе он блокируется. Есть ли способ сделать это? Я пытался сделать это с помощью функции сна, но из-за условий гонки это не дает правильного вывода. Это мой код

#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);
}

Ответы [ 2 ]

6 голосов
/ 14 сентября 2009

Невозможно выполнить двунаправленную синхронизацию на одном канале.

Вы можете выполнять двунаправленную синхронизацию на сокете домена Unix.

4 голосов
/ 14 сентября 2009

pipe () создает два файловых дескриптора, один для чтения и другой для записи. Для двусторонней связи необходимо создать два канала (четыре файловых дескриптора).

...