функция чтения никогда не возвращает 0 в C - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь читать значения с плавающей точкой через канал, пока в нем есть данные.Проблема в том, что функция чтения никогда не возвращает 0 в моем случае, поэтому моя функция никогда не выходит из цикла.
Более того, я не могу использовать библиотечные функции.

Чтобы дать вам контекст: я хочусоздать дочерние процессы, которые запускают следующую функцию.Каждое значение с плавающей точкой отправляется родителем через канал и читается одним из дочерних процессов, который должен находиться в спящем режиме, чтобы позволить другому дочернему процессу прочитать 1 другое значение и перейти в спящий режим.Когда процесс просыпается, он должен проверить, может ли он вернуть значение из канала в спящий режим, в противном случае цикл заканчивается и дочерний процесс завершается.

void worker(int * pip){
    close(pip[1]);
    float buffer;
    while(read(pip[0], &buffer, sizeof(float)) != 0){
        sleep(buffer);
    }
    exit(1);
}

Каждое значение записывается родителем таким образом в цикле:

write(pip[1], &values[i], sizeof(float))

1 Ответ

0 голосов
/ 26 ноября 2018

Вы должны позвонить close(pip[1]); после родителя write всех данных.

Может работать следующее code:

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void worker(int * pip){
  close(pip[1]);
  float buffer;
  while(read(pip[0], &buffer, sizeof(float)) != 0){
    printf("%f\n", buffer);
  }
  exit(1);
}

int main() {
  int pip[2];
  pipe(pip);

  if (fork() == 0) {
    worker(pip);
    exit(1);
  }

  close(pip[0]);
  float a[4] = {1.1, 2.2, 3.3, 4.4};

  for (int i = 0; i != sizeof(a) / sizeof(a[0]); ++i)
    write(pip[1], a + i, sizeof(a[0]));
  close(pip[1]);

  wait(NULL);

  return 0;
}
...