Sleep () вызывает разрыв трубы? - PullRequest
0 голосов
/ 12 марта 2020

Итак, в колледже я сейчас учусь параллельному программированию. Я делаю упражнения на трубах и имейте следующее:

Напишите программу, которая создает 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 секунды и просто заполняет трубу, я полагаю. Я не могу понять эту проблему и некоторое время безуспешно искал ответы.

Если бы я мог получить просветление по этому вопросу, я был бы благодарен.

1 Ответ

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

Проблема в том, что ваш l oop.

  while (something.round <= 10) {
            //sleep(2);  PROBLEM HERE
            strcpy(something.message, "Win");
            something.round++;

будет повторяться 11 раз.

Попробуйте something.round < 10

Кроме того, либо грипп sh stdout у ребенка или позвоните exit вместо _exit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...