Может ли epoll (в Linux) быть как-то полезным для обычных файлов? Я знаю, что он в основном используется с сокетами, но просто интересно.
Epoll на обычных файлах
Ответы (2)
Не совсем. epoll имеет смысл только для файловых дескрипторов, которые обычно демонстрируют блокирующее поведение при чтении/записи, таких как каналы и сокеты. Обычные файловые дескрипторы всегда более или менее немедленно возвращают результат или конец файла, поэтому epoll не сделает для них ничего полезного.
person
Community
schedule
08.11.2011
То есть работает, хотя и бессмысленно: Функция poll() должна поддерживать обычные файлы... Обычные файлы всегда должны опрашивать TRUE на чтение и запись. pubs.opengroup.org/onlinepubs/009695399/functions/poll.html На справочной странице epoll(4) сказано: при использовании в качестве интерфейса, запускаемого по уровню, epoll во всех смыслах является более быстрым опросом(2), и его можно использовать везде, где используется последний, поскольку он имеет ту же семантику. Поэтому, как говорит сумраквафф, ничего полезного от этого не будет.
- person mkj; 09.11.2011
Что так глупо и неправильно. Ядро может зависнуть по многим причинам, от раскрутки диска (если он спит) до сетевой задержки из-за подключенного к сети общего ресурса / диска. Любое взаимодействие с устройством может привести к зависанию ввода-вывода. select/epoll/poll/kqueue должен работать с любым файловым дескриптором, а любое описание файла должно разрешать неблокировку.
- person Rahly; 19.06.2017
@Rahly Это невозможно. Ядро не знает заранее, будет ли блокироваться запись в файл — в отличие от сокетов или каналов, буферы для записи файловой системы не предназначены для одного FD, поэтому нет способа гарантировать, что они будут доступны для конкретного процесса. .
- person ; 19.06.2017
@duskwuff уверен, что может, просто предпочитает не делать этого из-за определенных ограничений. Например, ядру известно, что содержится в буферах. Epoll вообще ничего не гарантирует. Просто более чем вероятно. Теоретически в любом случае упреждающее чтение может запросить у системы определенные данные и поместить сигнал EPOLLIN/EPOLLERR в очередь epoll. Кроме того, только потому, что это НЕ ДЕЛАЕТСЯ, не означает, что это все еще не глупо и/или неправильно. То, как выполняется реализация, не имеет отношения к тому, как она должна функционировать.
- person Rahly; 19.06.2017
В этом репозитории говорится, что Linux имеет ограниченную поддержку использования epoll как механизм асинхронного ввода-вывода [...], если файл открыт как O_NONBLOCK, то чтение будет возвращать EAGAIN до тех пор, пока соответствующая часть не окажется в памяти, что противоречит этому ответу. Но в простом тесте я не мог этого подтвердить. Кто прав?
- person nh2; 14.05.2018
@ nh2 Я бы сказал, что этот документ неверен. lwn.net/Articles/612483 имеет некоторую предысторию — в частности,
open(…, O_NONBLOCK) в настоящее время интерпретируется только как делая открытие файла неблокирующим, а не последующие операции ввода-вывода.
- person ; 14.05.2018
Думаю, на epoll_ctl с EPERM:
EPERM The target file fd does not support epoll.
если файл не имеет интерфейса poll().
Фактический код: http://lxr.linux.no/#linux+v3.1/fs/eventpoll.c#L1373
1373 /* The target file descriptor must support poll */
1374 error = -EPERM;
1375 if (!tfile->f_op || !tfile->f_op->poll)
1376 goto error_tgt_fput;
1377
person
osgx
schedule
08.11.2011