Итак, в колледже я сейчас учусь параллельному программированию. Я делаю упражнения на трубах и имейте следующее:
Напишите программу, которая создает 10 дочерних процессов для игры «Выиграйте трубу!». Должен быть только один канал, общий для всех процессов . Правила игры следующие: родительский процесс заполняет каждые 2 секунды структуру с сообщением «Win» и номером раунда (от 1 до 10) и записывает эти данные в канал; Каждый из дочерних процессов пытается прочитать данные из канала. Успешный ребенок должен напечатать сообщение о победе и номер раунда, завершив его выполнение значением выхода, равным номеру выигрышного раунда; Оставшиеся дочерние процессы продолжают пытаться читать данные из канала; После завершения всех дочерних процессов родительский процесс должен распечатать PID и выигрышный раунд каждого дочернего процесса.
У меня есть следующий код:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
struct Something {
char message[4];
char round;
};
int main() {
int fd[2];
pid_t pid;
struct Something something;
int status;
if (pipe(fd) == -1) {
perror("error creating pipe");
return 1;
}
for (int i = 0; i < 10; ++i) {
pid = fork();
if (pid == 0) { break; }
}
if (pid > 0) { //parent
close(fd[0]);
while (something.round <= 10) {
//sleep(2); PROBLEM HERE
strcpy(something.message, "Win");
something.round++;
write(fd[1], &something, sizeof(something));
}
close(fd[1]);
for (int i = 0; i < 10; ++i) {
pid = wait(&status);
printf("PID: %d won round %d\n", pid, WEXITSTATUS(status));
}
} else { //child
close(fd[1]);
read(fd[0], &something, sizeof(something));
close(fd[0]);
printf("%s %d", something.message, something.round);
_exit(something.round);
}
return 0;
}
Поэтому, когда я не прокомментировал sleep () и не запустил программу, что произойдет, если она замерзнет и ничего не напечатает, и дочерние процессы будут медленно завершаться один за другим, тогда я получу сообщение о разрыве канала.
Но когда я комментирую sleep (), программа работает просто отлично, хотя родитель не ждет 2 секунды и просто заполняет трубу, я полагаю. Я не могу понять эту проблему и некоторое время безуспешно искал ответы.
Если бы я мог получить просветление по этому вопросу, я был бы благодарен.