2011-11-08 14 views

Respuesta

11

No realmente. epoll solo tiene sentido para los descriptores de archivos que normalmente mostrarían un comportamiento de bloqueo en lectura/escritura, como las tuberías y los zócalos. Los descriptores de archivos normales siempre devolverán un resultado o un fin de archivo más o menos de inmediato, por lo que epoll no les haría nada útil.

+2

Es decir, funciona, aunque sin sentido: "La función de sondeo() apoyará archivos normales ... archivos regulares serán siempre sondear TRUE para la lectura y la escritura." http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html La página man de epoll (4) dice: "cuando se usa como una interfaz de disparo por nivel, epoll es, por supuesto, una encuesta más rápida (2), y se puede usar dondequiera que se use este último ya que comparte la misma semántica ". Por lo tanto, como dice duskwuff, no hará nada útil. – mkj

+1

Que es tan tonto e incorrecto El kernel puede colgarse por muchas razones, desde la activación del disco (si está dormida) hasta el retraso de la red desde un dispositivo compartido/unidad montado en la red. Cualquier tipo de interacción del dispositivo podría causar un cuelgue de IO. select/epoll/poll/kqueue se debe hacer funcionar con cualquier descriptor de archivo, así como cualquier descripción de archivo debe permitir el bloqueo. – Rahly

+0

@Rahly Eso no es posible. El núcleo no sabe de antemano si se bloqueará una escritura en un archivo; a diferencia de los sockets o pipes, los búferes para las escrituras del sistema de archivos no están dedicados a un solo FD, por lo que no hay forma de garantizar que estarán disponibles para un proceso específico . – duskwuff

11

creo, se producirá un error en epoll_ctl con EPERM:

EPERM The target file fd does not support epoll. 

si el archivo no tiene interfaz poll().

El código real es 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 
Cuestiones relacionadas