menú - Por qué se usa select en Linux
menú en shell script de linux (3)
Estaba pasando por un programa en serie y observé que usan select()
antes de usar read()
. ¿Por qué es exactamente esto requerido? ¿Por qué no podemos simplemente llamar directamente a read()
y verificar si falla o no? Además, ¿por qué tenemos que incrementar el descriptor de archivo en 1 y pasarlo mientras paso el descriptor de archivo establecido para select()
?
Ejemplo:
r=select(fd+1, &fds, NULL, NULL, &timeout);
donde fds ya tiene el valor de fd
La llamada al sistema select()
le dice si hay datos para leer en los descriptores de archivos que le interesan. En rigor, se trata de si una operación de lectura en el descriptor de archivo se bloqueará o no.
Si ejecuta read()
en un descriptor de archivo, como el que está conectado a un puerto serie, y no hay datos para leer, la llamada se bloqueará hasta que haya algunos datos para leer. Los programas que usan select()
no desean ser bloqueados así.
También preguntas:
¿Por qué tenemos que incrementar el descriptor de archivo en 1 y pasarlo mientras paso el descriptor de archivo establecido para
select
?
Eso probablemente especifique el tamaño del FD_SET pero probablemente lo esté haciendo mal . El primer argumento para select()
se conoce como nfds
y POSIX dice:
El argumento
nfds
especifica el rango de descriptores que se probarán. Los primeros descriptores denfds
se verificarán en cada conjunto; es decir, se deben examinar los descriptores de cero anfds-1
en los conjuntos de descriptores.
Entonces, para probar un descriptor de archivo n
, el valor en nfds
debe ser al menos n+1
.
Los programas que desean continuar ejecutándose mientras también leen la entrada de usuario interactiva 1 deben ser multiproceso o deben leer flujos de entrada con cuidado y, específicamente, condicionalmente.
select() se puede utilizar para implementar el segundo patrón de diseño. Puede determinar si la entrada se puede leer sin bloquear toda la aplicación.
1. O alguna otra entrada que llega impredeciblemente.