Seleccione la función y cómo utilizarla para nuestra función

select () de driver

  
? La interfaz de la función select () se basa principalmente en un tipo llamado 'fd_set'. It ('fd_set') es una colección de descriptores de archivos (fd). Dado que el tipo fd_set diferentes longitudes en diferentes plataformas, y por lo tanto debe utilizar un conjunto estándar de definiciones de macro para manejar estas variables:

fd_set conjunto; FD_ZERO (&set); /* establecer la clara * /FD_SET (fd, &set); /* fd se añade al conjunto * /FD_CLR (fd, &set); /* fd se borra * /FD_ISSET de este conjunto (fd, &set); /* si fd en en el conjunto de verdad * /en el pasado, sólo un fd_set típicamente comprende menos de o igual a 32 descriptores de archivo, de hecho, ya que sólo un vector de bits fd_set para lograr un int, en la mayoría de los casos, puede incluir cualquier fd_set valor de comprobación El descriptor de archivos es responsabilidad del sistema, pero determine cuánto se puede colocar su fd_set. En ocasiones, debe verificar /modificar el valor de la macro FD_SETSIZE. * Este valor depende del sistema * y también verifica el manual man () para seleccionar () en su sistema. Algunos sistemas tienen problemas con la compatibilidad con más de 1024 descriptores de archivos. [Nota del traductor: ¡Linux es un sistema así! Encontrará que el resultado de sizeof (fd_set) es 128 (* 8 = FD_SETSIZE = 1024) aunque rara vez se encontrará con esta situación. ]
interfaz básica

SELECT es simple:

int seleccionar (int nfds, fd_set * readset, fd_set * writeset, fd_set * exceptset, struct timeval * tiempo de espera); en la que:

nfds El número de descriptores de archivos que se deben verificar. El valor debe ser mayor que el número máximo de los tres conjuntos de fd_sets, no el número total de descriptores de archivos reales. Conjunto de lectura Un conjunto de descriptores de archivo que se utilizan para verificar la legibilidad. Writeset Un conjunto de descriptores de archivo utilizados para verificar la capacidad de escritura. Exceptset se utiliza para verificar el descriptor de archivo del estado inesperado.
(Nota: el error no es un estado inesperado). El puntero timeoutNULL representa una espera infinita, de lo contrario, es un puntero a la estructura de la hora, que representa el tiempo de espera más largo.
(Si tv_usec tv_sec y son iguales a 0, el estado del descriptor de archivo no se ve afectada, pero la función es no suspendido) devuelve un descriptor de archivo correspondiente al número total de acciones de respuesta, y tres conjuntos de datos están en la posición apropiada Modificado, solo aquellos que respondieron a la operación no fueron modificados. La macro FD_ISSET se debe utilizar para encontrar el grupo de descriptores de archivos devueltos.

A continuación se muestra un ejemplo de un simple análisis de un solo FD para facilitar la lectura:

int isReady (int fd) {int rc; FDS fd_set; struct televisión timeval; FD_ZERO (&FDS ); FD_SET (fd, &FDS); tv.tv_sec = tv.tv_usec = 0; rc = seleccione (FD + 1, &FDS, NULL, NULL, &tv); si (RC < 0) return -1; 1 :? 0; FD_ISSET (FDS fd, &); return}, por supuesto, si tomamos como puntero NULL, a continuación, pasó fd_set, lo que significa que sucede que esta operación no está interesado, pero seleccione () sigue esperando Hasta que pase o supere el tiempo de espera.

2, la función de selección necesita soporte de controlador. Hay una encuesta de función de miembro en la estructura de datos file_operations. El controlador puede usar la función de selección implementándola.

file_operations static struct FOPS = {ioctl: ioctl, mmap: mmap, accesibilidad: establecimiento abierto, suelte: liberación, sondeo: Voto rápido,}; wwpoll U32 (estructura de archivos * fp, poll_table * espera) {cid U32; inode = FP > > f_dentry-; d_inode;

//esto functiion wil esperar sigal que enviar por wake_up_interruptible (&CH- > pollqueue) poll_wait (fp, &CH- > pollqueue, Espere); if (ch- > pollflag) {ch- > pollflag = 0; if (cid < = WWENC_LAST) {return (POLLIN | POLLRDNORM);} else {//wwprtk (" wwpoll: return POLLOUT de wwpoll para cid =% d \\ n ", cid); return (POLLOUT | POLLWRNORM);}} return 0;}

[Nota del traductor: en Linux, el tiempo de espera se refiere al tiempo que el programa pasa en el estado de inactividad, no en el tiempo real del pasado. El tiempo involucrado en portar a plataformas no Linux no es igual. Transplant que comprende además en el estilo System V select () será el tiempo de espera antes de la función sale estado NULL a un indefinido, pero no es el caso en el BSD, Linux en System V compliant este respecto, el reciclaje de por lo tanto el puntero de tiempo de espera También debe prestar atención al problema. ]

Copyright © Conocimiento de Windows All Rights Reserved