Czy epoll
(w systemie Linux) może się przydać w przypadku zwykłych plików? Wiem, że jest używany głównie z gniazdkami, ale po prostu zastanawiam się.Epoll na zwykłych plikach
15
A
Odpowiedz
11
Niezupełnie. epoll
ma sens jedynie w przypadku deskryptorów plików, które normalnie wykazują blokujące zachowanie podczas odczytu/zapisu, takie jak rury i gniazda. Normalne deskryptory plików zawsze zwrócą wynik lub koniec pliku mniej więcej natychmiast, więc epoll
nie zrobi dla nich nic użytecznego.
11
myślę, że nie będzie w epoll_ctl z EPERM:
EPERM The target file fd does not support epoll.
jeśli plik ma poll()
interfejs.
Rzeczywisty kod jest 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
Oznacza to, że działa, choć bez sensu: „Funkcja poll() powinien obsługiwać regularne plików ... Regularne pliki będą zawsze sondowania TRUE dla odczytu i zapisu.” http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html Strona podręcznika epoll (4) mówi: "kiedy jest używany jako interfejs Level Triggered, epoll jest z całą pewnością szybszą ankietą (2), i może być użyty wszędzie tam, gdzie jest używany, ponieważ ma tę samą semantykę. " Dlatego, jak mówi zmierzch, nie zrobi nic użytecznego. – mkj
Co jest takie głupie i złe. Jądro może się zawiesić z wielu powodów, od podkręcania dysku (jeśli śpi), aż do opóźnienia sieci z udziału sieciowego/napędu. Wszelkiego rodzaju interakcje z urządzeniami mogą powodować zawieszanie zamówienia reklamowego. select/epoll/poll/kqueue powinno być skonfigurowane do pracy z dowolnym deskryptorem pliku, jak również każdy opis pliku powinien umożliwiać blokowanie. – Rahly
@Rahly To nie jest możliwe. Jądro nie wie z góry, czy zapis do pliku zostanie zablokowany - w przeciwieństwie do gniazd i potoków bufory do zapisu systemu plików nie są dedykowane do pojedynczego FD, więc nie ma możliwości zagwarantowania, że będą dostępne dla określonego procesu . – duskwuff