2011-11-08 1 views

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.

+2

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

+1

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

+0

@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

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