Pregunta Por qué se usa select en Linux


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 read() y verifica 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


32
2018-01-27 05:09


origen


Respuestas:


los select() la llamada al sistema 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. Programas usando select() no quiero ser bloqueado 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 sea especificando el tamaño del FD_SET pero probablemente lo esté haciendo mal. El primer argumento para select() que se conoce como nfds y POSIX dice:

los nfds argumento especifica el rango de descriptores que se probarán. El primero nfds los descriptores se verificarán en cada conjunto; es decir, los descriptores desde cero hasta nfds-1 en el descriptor se deben examinar los conjuntos.

Entonces, para probar un descriptor de archivo n, el valor en nfds al menos debe ser n+1.


37
2018-01-27 05:13



Programas que quieren continuar corriendo mientras además leer la entrada de usuario interactiva1 necesita ser multiproceso o necesitan leer flujos de entrada cuidadosamente y, específicamente, condicionalmente.

Select(2) se puede usar 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.


5
2018-01-27 05:28



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 IO (por ejemplo, read ()) no bloquee, lea el:página man

Lea también las API relacionadas


3
2018-01-27 05:13