Создание FIFO в UNIX

Я пытаюсь написать простую программу FIFO с тремя дочерними процессами, которые отправляют значение в файл, и родительский читают это. Моя проблема в том, что cfp = fopen (fifoName, "w"); должен убрать файл и сохранить новое значение, поэтому я думаю, что otput должно выглядеть так: "Это родительский элемент. Получено значение 30 из child on fifo", но мой вывод "Это родительский элемент. Получено значение 2010 от ребенка на fifo ". Спасибо за помощь.

Что не так в моем коде?

int main()
{
 int ret;
 int p1, p2, p3, p4;
 int value;
 char fifoName[] = "/tmp/testfifo20";
 char errMsg[1000];
 FILE *cfp;
 FILE *pfp;
 int x1;
 int x2, x3, x4;

 ret = mknod(fifoName, S_IFIFO | 0600, 0);
 if (ret < 0)
 {
 sprintf(errMsg, "Unable to create fifo: %s", fifoName);
 errexit(errMsg);
 }

 if ((p3 = fork()) == 0)
 {
 x1 = 10;
 cfp = fopen(fifoName, "w");
 if (cfp == NULL)
 errexit("Unable to open fifo for writing");
 ret = fprintf(cfp, "%d", x1);
 fflush(cfp);
 exit(0);
 }

 if ((p2 = fork()) == 0)
 {
 x2 = 20;
 cfp = fopen(fifoName, "w");
 if (cfp == NULL)
 errexit("Unable to open fifo for writing");
 ret = fprintf(cfp, "%d", x2);
 fflush(cfp);
 exit(0);
 }

 if ((p3 = fork()) == 0)
 {
 x3 = 30;
 cfp = fopen(fifoName, "w");
 if (cfp == NULL)
 errexit("Unable to open fifo for writing");
 ret = fprintf(cfp, "%d", x3);
 fflush(cfp);
 exit(0);
 }
 else
 {
 pfp = fopen(fifoName, "r");
 if (pfp == NULL)
 errexit("Unable to open fifo for reading");
 ret = fscanf(pfp, "%d", &value);
 if (ret < 0)
 errexit("Error reading from named pipe");
 fclose(pfp);
 printf("This is the parent. Received value %d from child on fifo \n",
 value);
 unlink(fifoName);
 exit(0);
 }
}
1 ответ

Почему вы ожидаете 30? Вы должны ожидать любую комбинацию 10, 20 и 30, например 102030 или 3020 или 20 или 2010.

2010 - вполне разумный результат. Вы раскошелитесь на 3 ребенка. На самом деле у 1-й вилки есть опечатка, поскольку вы храните ее PID в p3 вместо p1. Но это не имеет значения.

Важно то, что планирование родительского процесса и его 3 детей не в ваших руках. По-видимому, ядро планировало ваши процессы в следующем порядке:

  • p2: написал 20 в FIFO
  • p1: написал 10 в FIFO, который содержит 2010
  • parent: читать 2010 из FIFO, который теперь пуст
  • p3: написал 30 в FIFO, который теперь содержит 30

Но родительский процесс только читает FIFO один раз, поэтому он пропустил 30.

licensed under cc by-sa 3.0 with attribution.