script menú hacer example como c linux file-descriptor select-syscall

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 de nfds se verificarán en cada conjunto; es decir, se deben examinar los descriptores de cero a nfds-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.


Utiliza la llamada select cuando tiene que monitorear constantemente los descriptores de archivos hasta que se preparan para algún IO sin bloqueo.

Generalmente se usa cuando quiere que el IO (por ejemplo, read ()) no bloquee, lea la página : man

Lea también las API relacionadas