
leeroy
los Seleccione syscall toma 3 conjuntos de descriptores de archivos para ver fds para leer/escribir y “excepciones” en el descriptor de archivos.
mi selección página man no dice mucho sobre el exceptfd
conjunto de descriptores. Para qué se usa esto; ¿Qué tipo de excepciones puede y notificará en los descriptores de archivos?
Supongo que esto puede ser diferente para el tipo de descriptor… ya sea un socket TCP, una tubería, un tty, etc.). ¿Alguien tiene más información sobre qué tipo de errores select
puede informar sobre los diferentes tipos de descriptores?
A veces se piensa que exceptofds es necesario para detectar errores, pero eso es un concepto erróneo. Los errores se marcarán en leerfds. Aunque POSIX lo requiere (e incluso llama al parámetro errorfds), depende del sistema operativo si los errores también se marcan en exceptofds. Realmente, este parámetro solo es necesario si te importa condiciones excepcionalespero rara vez hay necesidad de detectarlos.
Lo que se considera una condición excepcional depende del tipo de descriptor de archivo, pero el uso más común, con mucho, es en un socket TCP, donde indica que los datos fuera de banda están disponibles para ser leídos usando recv()
con el MSG_OOB
bandera. Sin embargo, los datos fuera de banda de TCP tienen una serie de peculiaridades (p. ej., solo puede estar pendiente 1 byte) y, como resultado, rara vez se utilizan.
En kernels de Linux recientes exceptofds se puede usar para detectar cuándo cambian ciertos atributos de sysfs. El valor actual del atributo se puede leer leyendo el archivo apropiado en /sys
y un select()
en el descriptor de archivo marcará exceptofds cuando el atributo cambia. Sin embargo, esto actualmente solo funciona para algunos de los atributos y para cambios de montaje (/proc/mounts
).
Además, algunos controladores de dispositivos marcarán ciertas condiciones específicas del dispositivo usando exceptofds.
Tiene razón, depende del tipo de dispositivo al que haga referencia con los descriptores de archivo. Entonces, es diferente para sockets, FIFO, puertos seriales, etc.
Mire la página del manual para read(). En la parte inferior (al menos en OS X) enumera los diferentes errores que puede obtener para diferentes dispositivos. Lo mismo ocurre con escribir().
Para sockets, FIFO y otros mecanismos IPC, consultaría Programación de red Unix, Volúmenes 1 y 2. IIRC describe qué tipo de errnos esperar para diferentes condiciones de error.
Recorrí este camino una vez con FIFO. Terminé haciendo una lluvia de ideas sobre todas las formas en que el productor y el consumidor podrían interactuar con cada extremo del FIFO y luego escribí casos de prueba para cada una de esas situaciones. Fue una buena (aunque tediosa) manera de descubrir todas las diferentes condiciones de error. Sin embargo, aprendí mucho y, en última instancia, el código simplemente funciona ahora.