2012-05-16 8 views
7

Durante la depuración de nuestra aplicación en el entorno Linux, podemos observar que algunos eventos - POLLHUP|POLLIN ocurren solo en Linux. Nuestra aplicación usa conectores Unix. Cuando hacemos:Implementación de encuesta en la implementación de linux vs poll en solaris

ret = poll(xpoll->pfd, xpoll->pfd_count, xpoll_timeout); 

strace muestra:

poll([{fd=4, events=POLLIN|POLLPRI|POLLERR|POLLHUP}, {fd=6, events=POLLIN|POLLPRI|POLLERR|POLLHUP}, {fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 3, 16) = 1 
([{fd=7, revents=POLLIN|POLLHUP}]) 

Esa situación no se da en Solaris (misma aplicación): Struss muestra:

2463/3:     fd=569 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=0 
2463/3:     fd=639 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=0 
2463/3:     fd=631 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=POLLIN 
2463/3:     fd=1160 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=0 
2463/3:     fd=400 ev=POLLIN|POLLPRI|POLLERR|POLLHUP rev=0 

¿Me podría explicar lo que se la diferencia entre encuesta en solaris y encuesta en liunx? Thx de antemano para todas las respuestas.

+0

Linux devuelve POLLIN (datos para leer) incluso en caso de EOF. Linux no hay indicador POLLEOF. Eso es todo lo que hago ahora. – B4NZ41

Respuesta

3

Tanto Linux como Solaris solían fallar al establecer POLLIN para EOF en algunos tipos de archivos, especialmente en las tuberías. Una solución común fue verificar POLLHUP y POLLIN juntos. Por lo que yo sé, los desarrolladores centrales de Linux lo mantuvieron de esa manera (probablemente previsto), mientras que los compañeros de Solaris cambiaron ese comportamiento para usar POLLIN POLLEOF.

Sin embargo, esto no debería ser un problema para su aplicación: para aumentar la portabilidad de una aplicación, siempre se verificaría para ambas banderas en la máscara de bits.

¡Salud!

+0

Por cierto, ya que POLLEOF no es parte de POSIX - tal vez es un alias para otra macro (-combinación) como POLLIN o POLLIN | POLLHUP? Tengo que verificar que ... – mjhennig

Cuestiones relacionadas