sintaxis semanticas semantica section nuevas etiquetas estructurales estructura elementos ejemplos c unix select systems-programming

semanticas - semantica html5 ejemplos



* nix select y exceptfds/errorfds semántica (2)

A veces se piensa que se necesita exceptfds para detectar errores, pero eso es un error. Los errores serán marcados en lecturas . 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 le importan las condiciones excepcionales , pero solo en raras ocasiones existe la necesidad de detectarlas.

Lo que califica como una condición excepcional depende del tipo de descriptor de archivo, pero de lejos el uso más común es en un socket TCP donde indica que los datos fuera de banda están disponibles para ser leídos usando recv() con el indicador MSG_OOB . Sin embargo, los datos TCP fuera de banda tienen una serie de peculiaridades (por ejemplo, solo 1 byte puede estar pendiente) y, como resultado, son raramente utilizados.

En los kernels de Linux recientes, exceptfds se pueden 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 al select() en el descriptor del archivo se marcará excepto cuando el atributo cambie. Sin embargo, esto actualmente solo funciona para algunos de los atributos y para los cambios de montaje ( /proc/mounts ).

Además, algunos controladores de dispositivos marcarán ciertas condiciones específicas del dispositivo utilizando exceptfds .

El syscall de select toma 3 conjuntos de descriptor de archivo para ver fds legibles / grabables y "excepciones" en el descriptor de archivo.

Mi página de selección de hombre no dice mucho sobre el exceptfd descriptores exceptfd . Para qué se usa esto; ¿Qué tipo de excepciones puede y va a notificar en los descriptores de archivos?

Asumo que esto puede ser diferente para el tipo de descriptor ... ya sea un socket TCP, un pipe, un tty, etc.). ¿Alguien tiene más información sobre qué tipo de errores select puede informar sobre los diferentes tipos de descriptores?


Tienes razón, depende del tipo de dispositivo al que te refieres con los descriptores de archivos. Por lo tanto, es diferente para tomas de corriente, FIFO, puertos serie, etc.

Mire la página man para leer (). En la parte inferior (al menos en OS X) enumera los diferentes errores que puede obtener para diferentes dispositivos. Lo mismo vale para write ().

Para tomas de corriente, FIFO y otros mecanismos de IPC, verificaría la programación de red de Unix, volúmenes 1 y 2. IIRC describe qué tipo de errores esperar para diferentes condiciones de error.

Caminé este camino una vez con FIFOs. Terminé haciendo una lluvia de ideas sobre cómo el productor y el consumidor podían interactuar con cada extremo de la FIFO y luego escribí casos de prueba para cada una de esas situaciones. Fue una buena (aunque tediosa) forma de descubrir todas las diferentes condiciones de error. Aprendí mucho y finalmente el código funciona ahora.