Red de conocimiento informático - Material del sitio web - En la interacción de notificación asincrónica entre controladores de dispositivos y aplicaciones en Linux, ¿cuál es la función de agregar liberación de señal en el controlador de dispositivo?

En la interacción de notificación asincrónica entre controladores de dispositivos y aplicaciones en Linux, ¿cuál es la función de agregar liberación de señal en el controlador de dispositivo?

En la interacción de notificación asincrónica entre el controlador del dispositivo y la aplicación, no es suficiente capturar la señal solo en el lado de la aplicación, porque la fuente de la señal está en el lado del controlador del dispositivo. Por lo tanto, se debe permitir que el controlador del dispositivo libere la señal en el momento apropiado y se debe agregar al controlador del dispositivo el código relevante para la liberación de la señal. Para que el dispositivo admita el mecanismo de notificación asincrónica, el controlador implica tres tareas.

1) Admite el comando F_SETOWN y puede configurar filp->f_owner en el ID de proceso correspondiente en este procesamiento de comando de control. Sin embargo, este trabajo ha sido completado por el kernel y no es necesario que el controlador del dispositivo lo maneje.

2) Admite el procesamiento del comando F_SETFL Siempre que cambie el indicador FASYNC, se ejecutará la función fasync() en el controlador. Por lo tanto, la función fasync() debe implementarse en el controlador.

3) Cuando los recursos del dispositivo estén disponibles, llame a la función kill_fasync() para activar la señal correspondiente.

Las tres tareas anteriores en el controlador corresponden a las tres tareas en la aplicación. La programación de notificaciones asincrónicas en el controlador del dispositivo es relativamente simple y utiliza principalmente una estructura de datos y dos funciones. La estructura de datos es la estructura fasync_struct y las dos funciones son:

1) La función que maneja los cambios del indicador FASYNC.

int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa);

2) Función para liberar señales.

void kill_fasync(struct fasync_struct **fa, int sig, int band);

Al igual que otros controladores de dispositivos, colocar el puntero de estructura fasync_struct en la estructura del dispositivo sigue siendo la mejor opción.

En la función fasync() del controlador de dispositivo, solo necesita pasar los tres parámetros de la función y el puntero al puntero de estructura fasync_struct como cuarto parámetro a la función fasync_helper().

Cuando los recursos del dispositivo están disponibles, se debe llamar a kill_fasync() para liberar la señal SIGIO. Cuando es legible, el tercer parámetro se establece en POLL_IN, y cuando se puede escribir, el tercer parámetro se establece en POLL_OUT.