мой учитель сказал, что если конец записи канала закрыт, дочерний процесс больше не может читать с конца чтения канала, и чтение приведет к ошибке 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 при любом предстоящем чтении (так, чтобы ребенок мог прочитать все уже отправленные символы).Я прав?