Из того, что я читал на веб-сайте Open Group на fcntl
, open
, read
и write
, создается впечатление, что если O_NONBLOCK
задан в файловом дескрипторе, и, следовательно, будет ли использоваться неблокирующий ввод-вывод с дескриптором, должно быть свойство этого файлового дескриптора, а не основной файл. Например, свойство дескриптора файла означает, что если я дублирую файловый дескриптор или открываю другой дескриптор в тот же файл, то я могу использовать блокирующий ввод-вывод с одним и неблокирующим вводом-выводом с другим.
O_NONBLOCK
, является свойством основной файл [FIFO]):
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fds[2];
if (pipe(fds) == -1) {
fprintf(stderr, "`pipe` failed.\n");
return EXIT_FAILURE;
}
int fd0_dup = dup(fds[0]);
if (fd0_dup <= STDERR_FILENO) {
fprintf(stderr, "Failed to duplicate the read end\n");
return EXIT_FAILURE;
}
if (fds[0] == fd0_dup) {
fprintf(stderr, "`fds[0]` should not equal `fd0_dup`.\n");
return EXIT_FAILURE;
}
if ((fcntl(fds[0], F_GETFL) & O_NONBLOCK)) {
fprintf(stderr, "`fds[0]` should not have `O_NONBLOCK` set.\n");
return EXIT_FAILURE;
}
if (fcntl(fd0_dup, F_SETFL, fcntl(fd0_dup, F_GETFL) | O_NONBLOCK) == -1) {
fprintf(stderr, "Failed to set `O_NONBLOCK` on `fd0_dup`\n");
return EXIT_FAILURE;
}
if ((fcntl(fds[0], F_GETFL) & O_NONBLOCK)) {
fprintf(stderr, "`fds[0]` should still have `O_NONBLOCK` unset.\n");
return EXIT_FAILURE; // RETURNS HERE
}
char buf[1];
if (read(fd0_dup, buf, 1) != -1) {
fprintf(stderr, "Expected `read` on `fd0_dup` to fail immediately\n");
return EXIT_FAILURE;
}
else if (errno != EAGAIN) {
fprintf(stderr, "Expected `errno` to be `EAGAIN`\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Это заставляет меня думать: возможно ли иметь неблокирующий дескриптор ввода-вывода и блокировать дескриптор ввода-вывода в один и тот же файл, и если да, зависит ли он от типа файла (обычный файл, FIFO, блокировать специальный файл, специальный файл символов, сокет и т.д.)?