Можно ли сделать неблокирующий ввод-вывод на трубе? fcntl не может установить O_NONBLOCK. Страница 918 интерфейса программирования Linux включает в себя таблицу «Семантика чтения n байтов из канала или FIFO (p)». В этой таблице показано поведение труб и FIFO с одним столбцом под названием O_NONBLOCK? Это означало бы, что вы можете установить флаг O_NONBLOCK в трубе. Это верно? Следующий код не может установить флаг, fcntl (2) не сообщает об ошибке.Неблокируемое считывание на трубе
#include <fcntl.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define SLEEP 1
int
main(int argc, char *argv[]) {
pid_t childPid;
int pfd[2];
int nread, flags;
int c = 'a';
setbuf(stdout, NULL);
if (pipe(pfd) == -1) {
printf("error: pipe");
exit(EXIT_FAILURE);
}
switch (childPid = fork()) {
case -1:
printf("error: fork");
exit(EXIT_FAILURE);
case 0: /* child */
if (close(pfd[0]) == -1) {
printf("child: close pfd read");
exit(EXIT_FAILURE);
}
sleep(SLEEP);
_exit(EXIT_SUCCESS);
default:
break;
/* parent falls through */
}
if (close(pfd[1]) == -1) {
printf("parent: close pipe write");
exit(EXIT_FAILURE);
}
flags = fcntl(pfd[0], F_GETFD);
flags |= O_NONBLOCK;
if (fcntl(pfd[0], F_SETFD, flags))
perror("fcntl");
/* verify flags set correctly */
flags = fcntl(pfd[0], F_GETFD);
if (!(flags & O_NONBLOCK)) {
printf("failed to set O_NONBLOCK\n");
exit(EXIT_FAILURE);
}
wait(NULL);
exit(EXIT_SUCCESS);
}
Это похоже на ошибку в операции 'F_GETFD'. Я подтвердил, что это фактически устанавливает дескриптор неблокирования, и операции не блокируются, но 'F_GETFD' все равно возвращает ноль. –