Есть ли способ синхронизации родителя и потомка в C, используя один канал в Unix?

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

  •  07-07-2019
  •  | 
  •  

Вопрос

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

#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 () создает два файловых дескриптора, один для чтения и другой для записи. Для двусторонней связи необходимо создать два канала (четыре файловых дескриптора).

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top