Estoy depurando una aplicación en Linux. Y tiene un par de hilos que periódicamente llaman a la llamada del sistema seleccionado:

strace muestra:

select(0, NULL, NULL, NULL, {1, 342414})

Entonces nfds=0. Pensé que nfds es el número más alto de descriptor de archivo que ocurre en cualquiera de los conjuntos readfds, writefds y exceptfds incrementados en uno. No puede ser una entrada estándar (fd=0), porque entonces tendría nfds=1.

Entonces, ¿cuál es el significado de nfds=0 en este caso?

¡Gracias!

2
Aris Koning 13 sep. 2018 a las 11:45

3 respuestas

La mejor respuesta

Por lo general, select duerme hasta que expira el tiempo de espera o se produce un evento en uno de los descriptores de archivo. Si no hay descriptores de archivo, el tiempo de espera es el único comportamiento restante.

Mi página de manual local para select(2) incluso incluye el texto

Algunas llamadas de código seleccionan () con los tres conjuntos vacíos, nfds cero y un tiempo de espera no NULL como una forma bastante portátil de dormir con precisión de un segundo.

5
Useless 13 sep. 2018 a las 08:57

El argumento nfds no es el descriptor más grande, es el + 1. más grande. Entonces, si viste stdin con un descriptor de archivo de 0, deberías pasar 1.

Efectivamente select(0, NULL, NULL, NULL, {1, 342414}) dice que no hay descripciones de archivo, y los conjuntos de descriptores de archivo reales se pasan como NULL, por lo que incluso se comprueban. Por lo tanto, solo el tiempo de espera tendrá algún efecto en esta llamada.

1
nos 13 sep. 2018 a las 08:50

Tenga en cuenta que los conjuntos de descriptores son punteros nulos. En ese caso, el primer argumento no se usa realmente y select simplemente se usa para poner el hilo a dormir. Por 1 segundo y 342414 microsegundos (a menos que haya una señal que interrumpa el sueño).

2
Some programmer dude 13 sep. 2018 a las 08:49