* nix select y exceptfds/errorfds semántica

3 minutos de lectura

avatar de usuario
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 /sysy 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.

  • aunque interesante, eso no responde a la pregunta. Si entiendo correctamente su respuesta, está hablando de posibles condiciones de error (errno) activadas al leer y eso no tiene nada que ver con exceptfds

    – kriss

    24 de agosto de 2016 a las 9:47

  • Esto fue de hace siete años. Desearía poder decirte a qué me refiero, pero ni siquiera recuerdo haber escrito esta respuesta. Lo siento, no voy a poder aclararte mis declaraciones.

    – Rob Jones

    10/09/2016 a las 20:22

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad