Чтение из канала, даже если конец записи закрыт - PullRequest
0 голосов
/ 26 сентября 2018

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

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

int main(void) {
    int pipefd[2];
    char c;

    pipe(pipefd);

    if (fork() == 0) {
        close(pipefd[1]);
        sleep(5);
        // The parent has already closed pipefd[1]
        while (read(pipefd[0], &c, 1)) {
            printf("%c", c);
        }
        close(pipefd[0]);
        return 0;
    }

    close(pipefd[0]);

    char str[] = "foo";
    write(pipefd[1], str, 4);

    close(pipefd[1]);

    return 0;
}

Выход на стандартный вывод через 5 секунд равен foo.Итак, я понимаю, что закрытие конца записи просто добавляет EOF после символов, которые уже есть, и НЕ отправляет EOF при любом предстоящем чтении (так, чтобы ребенок мог прочитать все уже отправленные символы).Я прав?

1 Ответ

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

Как вы выяснили, ваш учитель не прав.

Вы не получите "ошибку" из-за разбитой трубы (которая фактически является комбинацией сигнала SIGPIPE и ошибки EPIPEесли это игнорируется), при попытке прочитать из разорванного канала, но при попытке записи в разорванный канал.

Для систем Linux выВы можете прочитать больше об этом здесь , или вы можете взглянуть на справочную страницу BSD pipe (2) .

...