Вилка ожидания и труба в C - PullRequest
1 голос
/ 01 марта 2020

У меня есть это назначение, где мы должны создать определенное количество c дочерних процессов, скажем, 3, и заставить родителя ждать, пока каждый дочерний элемент завершит sh. Кроме того, у нас должен быть канал, в который все процессы записывают данные, чтобы после завершения родительского процесса он использовал канал для вывода суммы всех дочерних результатов.

Это мой код. но кажется, что wait(NULL) не работает, как ожидалось. Я не уверен, что я делаю неправильно.

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

int main() {
  for (int i=0; i<3; i++) {
    pid_t child = fork();
    if (child > 0) {
      printf("Child %d created\n", child);
      wait(NULL);
      printf("Child %d terminated\n", child);
    }
  }

  printf("Parent terminated\n");
  return 0;
}

1 Ответ

1 голос
/ 01 марта 2020

Прежде всего, лучше сначала запустить все дочерние процессы, а затем ждать их все, а не ждать каждого из них последовательно.

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

В-третьих, вы должны обратить внимание и дождаться всех детей после l oop, а не только первого, заканчивающегося:

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

int main() {
  for (int i=0; i<3; i++) {
    pid_t child = fork();
    if (child > 0) {
      printf("Child %d created\n", child);
    }
    else if (child == 0) {
      printf("In child %d. Bye bye\n", i);
      return 0; // exit the child process
    }
  }

  while (wait(NULL) > 0); // wait for all child processes

  printf("Parent terminated\n");
  return 0;
}

РЕДАКТИРОВАТЬ:

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

Вот хороший пример для этого.

...