Servicio de kernel fp_select

Finalidad

Proporciona soporte en cascada, o redirigido, de la solicitud de selección o sondeo.

Sintaxis

#include <sys/types.h> #include <sys/errno.h> int fp_select ( fp, events, rtneventp, notify) archivo de estructura *fp; ushort sucesos; ushort *rtneventp; void (*notify) ();

Parámetros

Elemento Descripción
FP Apunta a la instancia abierta del controlador de dispositivo, socket o conducto para el que se pretende la operación de selección de bajo nivel.
sucesos Identifica los sucesos que se van a comprobar. Hay tres distintivos de suceso estándar definidos para las funciones Encuesta y seleccionar y un distintivo informativo. El archivo /usr/include/sys/poll.h detalla la definición de bit de suceso. Los cuatro indicadores básicos son:
POLLIN
La entrada está presente para el objeto especificado.
POLLOUT
El objeto de archivo especificado es capaz de aceptar la salida.
POLLPRI
Se ha producido una condición de excepción en el objeto especificado.
POLLSYNC
Sólo se trata de una solicitud síncrona. Si ninguno de los sucesos solicitados es true, la rutina seleccionada no debe recordar esta solicitud como pendiente. Es decir, la rutina no necesita llamar al servicio selnotify debido a esta solicitud.
rtneventp Indica el puntero de sucesos devueltos. Este parámetro, pasado por referencia, se utiliza para indicar qué sucesos seleccionados son verdaderos en el momento actual. Los bits de suceso devueltos incluyen los sucesos solicitados más un indicador de suceso de error adicional:
POLLERR
Se ha indicado una condición de error en la rutina de selección del objeto. Si se establece este distintivo, el código de retorno distinto de cero de la rutina de selección del objeto especificado se devuelve como código de retorno del servicio de kernel de fp_select .
notify Apunta a una rutina que debe llamarse cuando el objeto especificado invoca el servicio de kernel de selnotify para una solicitud de evento de sondeo o selección asíncrona pendiente. Si no se debe llamar a ninguna rutina, este parámetro debe ser NULL.

Descripción

El servicio de kernel de fp_select es un servicio de bajo nivel utilizado por extensiones de kernel para realizar una operación de selección para un dispositivo abierto, socket o conducto con nombre. El servicio de kernel de fp_select se puede utilizar para solicitudes de selección síncrona y asíncrona. Las solicitudes síncronas informan sobre el estado actual de un dispositivo y las solicitudes asíncronas permiten que el llamante sea notificado de sucesos futuros en un dispositivo.

Invocación desde la rutina ddselect de un controlador de dispositivo

La rutina ddselect del controlador de dispositivo puede llamar al servicio de kernel de fp_select para pasar solicitudes de selección/sondeo a otros controladores de dispositivo. La rutina ddselect para un dispositivo invoca el servicio de kernel de fp_select , que llama a la rutina ddselect para un segundo dispositivo, y así sucesivamente. Esto es necesario cuando la información de sucesos para el dispositivo original depende de sucesos que se producen en otros dispositivos. Se puede iniciar una cadena en cascada de solicitudes de selección que implica más de dos dispositivos, o un solo dispositivo puede emitir llamadas de fp_select a varios otros dispositivos.

Cada rutina de ddselect debe conservar, en su llamada al servicio de kernel de fp_select , el mismo indicador de POLLSYNC que recibió cuando el servicio de kernel de fp_select lo llamó anteriormente.

Invocación desde fuera de una rutina de ddselect del controlador de dispositivo

Si el servicio de kernel de fp_select se invoca fuera de la rutina ddselect del controlador de dispositivo, el servicio de kernel de fp_select establece el distintivo POLLSYNC , siempre haciendo que la solicitud sea síncrona. En este caso, no se produce ninguna notificación de sucesos futuros para el dispositivo especificado, ni se llama a una rutina notificar , si se especifica. El servicio de kernel de fp_select se puede utilizar de esta forma (no relacionado con un sondeo o una solicitud de selección en curso) para comprobar el estado actual de un objeto.

Proceso asíncrono y el uso de la rutina de notificación

Para las solicitudes asíncronas, el servicio de kernel de fp_select permite a sus llamantes registrar una rutina notificar para que el kernel la llame cuando los sucesos especificados sean verdaderos. Cuando el controlador de dispositivo relevante detecta que uno o más sucesos pendientes se han convertido en true, invoca el servicio de kernel de selnotify . A continuación, el servicio de kernel de selnotify llama a la rutina notificar , si se ha registrado una. Por lo tanto, la rutina notificar se llama en el tiempo de interrupción y se debe programar para que se ejecute en un entorno de interrupción.

El uso de una rutina notificar afecta tanto a la secuencia de llamada en el tiempo de interrupción como a cómo se informa realmente de la información solicitada. El proceso asíncrono generalizado implica la siguiente secuencia de sucesos:

  1. Una solicitud de selección se inicia en un dispositivo y se pasa (por varias invocaciones de servicio de kernel de fp_select ) a otros dispositivos. Con el tiempo, se alcanza la rutina ddselect del controlador de dispositivo que no depende de otros dispositivos para obtener información. Esta rutina de ddselect encuentra que ninguno de los sucesos solicitados es true, pero recuerda la solicitud asíncrona y vuelve al llamante. De esta forma, se restituye toda la cadena de llamadas, hasta que se alcanza el origen de la solicitud selecta. A continuación, el núcleo pone el proceso de origen a dormir.
  2. Más tarde, uno o más sucesos se convierten en true para el dispositivo que recuerda la solicitud asíncrona. La rutina del controlador de dispositivo (posiblemente un manejador de interrupción) llama al servicio de kernel de selnotify .
  3. Si los sucesos todavía se están esperando, el servicio de kernel de selnotify responde de una de dos maneras. Si no se ha registrado ninguna rutina notificar cuando se ha realizado la solicitud de selección para el dispositivo, se despiertan todos los procesos que esperan sucesos en este dispositivo. Si existe una rutina notificar para el dispositivo, se llama a esta rutina. La rutina notificar determina si el suceso solicitado original se debe informar como true y, si es así, llama al servicio de kernel de selnotify por su cuenta.

El ejemplo siguiente detalla un escenario en cascada que implica varios dispositivos. Suponga que se ha realizado una solicitud para el dispositivo A y el dispositivo A depende del dispositivo B, que depende del dispositivo C. Cuando los sucesos especificados se convierten en true en el dispositivo C, el servicio de kernel de selnotify llamado del controlador de dispositivo del dispositivo C se realiza de forma diferente en función de si se ha registrado una rutina notificar en el momento de la solicitud.

Proceso en cascada sin el uso de rutinas de notificación

Si no se ha registrado ninguna rutina de notificar del dispositivo B, el servicio de kernel de selnotify determina que los sucesos especificados se deben considerar como true para el controlador de dispositivo en la cabecera de la cadena en cascada. (El jefe de la cadena, en este caso el Dispositivo A, es el primer controlador de dispositivo que emite el servicio de kernel de fp_select desde su rutina de selección.) El servicio de kernel de selnotify despierta todos los procesos en espera de sucesos que se han producido en el dispositivo A.

Es importante tener en cuenta que cuando no se utiliza ninguna rutina de notificar , cualquier controlador de dispositivo de la cadena de llamada que informa de un suceso con el servicio de kernel de selnotify hace que ese suceso aparezca verdadero para el primer dispositivo de la cadena. Como resultado, se despiertan los procesos que esperan sucesos que se han producido en ese primer dispositivo.

Proceso en cascada con rutinas de notificación

Si, por el contrario, se han registrado rutinas de notificar en toda la cadena, cada dispositivo de interrupción (llamando al servicio de kernel de selnotify ) invoca la rutina notificar para el dispositivo que se encuentra encima de ella en la cadena de llamada. Por lo tanto, en el ejemplo anterior, el servicio de kernel de selnotify para el dispositivo C llama a la rutina notificar registrada cuando la rutina ddselect del dispositivo B ha invocado el servicio de kernel de fp_select . La rutina notificar del dispositivo B debe decidir si volver a llamar al servicio de kernel de selnotify para alertar de la rutina de notificar de Device A. Si es así, se llama a la rutina notificar del dispositivo A y toma su propia determinación si se debe llamar a otra rutina selnotify . Si lo hace, el servicio de kernel de selnotify despierta todos los procesos en espera de sucesos ocurridos para el dispositivo A.

Una variación en este escenario implica una cadena en cascada en la que sólo algunos controladores de dispositivo han registrado rutinas de notificar . En este caso, el servicio de kernel de selnotify en cada nivel llama a la rutina notificar para el nivel anterior, hasta que se encuentra un nivel para el que no se ha registrado ninguna rutina notificar . En este punto, todos los eventos de interés están determinados a ser ciertos para el controlador de dispositivo en la cabeza de la cadena en cascada. Si las rutinas notificar se han registrado en niveles superiores al nivel actual, nunca se llaman.

Volviendo del servicio de kernel fp_select

El servicio de kernel de fp_select no espera a que los sucesos seleccionados se conviertan en true, pero vuelve inmediatamente después de que se haya completado la llamada a la rutina ddselect del objeto.

Si la rutina de selección del objeto se llama satisfactoriamente, el código de retorno para el servicio de kernel de fp_select se establece en el código de retorno proporcionado por la rutina ddselect del objeto.

Entorno de ejecución

El servicio de kernel de fp_select sólo se puede llamar desde entorno de proceso .

Valores de retorno

Elemento Descripción
0 Indica una finalización satisfactoria.
FEAGA Indica que la asignación de estructuras de datos internas ha fallado. El parámetro rtneventp no se ha actualizado.
EINVAL Indica que el parámetro fp no es un puntero de archivo válido. El parámetro rtneventp tiene el distintivo POLLNVAL establecido.

El servicio de kernel de fp_select también se puede establecer en el código de retorno distinto de cero de la rutina ddselect del objeto especificado. El parámetro rtneventp tiene el distintivo POLLERR establecido.