Есть ли способ синхронизации родителя и потомка в C, используя один канал в Unix?
-
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.
Не связан с StackOverflow