¿Qué es una buena manera portátil para poner en práctica un evento signalable global en un entorno POSIX
Pregunta
El caso es que el uso de una aplicación genera un evento y envía una señal de que cualquier aplicación que quiera escuchar para que van a recibir. P.ej. una aplicación actualiza el contenido de un archivo y las señales de esto. En Linux esto se podría hacer por los camareros que llaman inotify en el archivo. Una forma portátil sería para que los oyentes se registra en un servidor conocido, pero yo preferiría algo más sencillo si es posible. Tan portátil como sea posible utilizando sólo significa idealmente POSIX características que también están ampliamente disponibles.
Solución
Opción usar el bloqueo de archivos
Se puede hacer esto mediante el bloqueo de un archivo.
Señal emisor configuración inicial:
- Crea un archivo con un nombre muy conocido y bloquearlo para la escritura (
fcntl(F_SETLK)
conF_WRLCK
o manada (LOCK_EX) `).
señal de procedimiento receptor:
- Abrir el archivo con el nombre de archivo conocido y tratar de obtener un bloqueo de lectura en él (
fcntl(F_SETLK)
conF_RDLCK
oflock(LOCK_SH)
). - Receptor bloques debido a que el emisor está llevando a cabo un bloqueo de escritura en conflicto.
emisión de señal:
- crea emisor de señal un nuevo archivo temporal
- emisor de señal obtiene un bloqueo de escritura en el nuevo archivo temporal
- emisor de señal cambia el nombre del nuevo archivo temporal al nombre de archivo conocido. Este clobbers el archivo de bloqueo de edad, pero los receptores de espera retener todas las referencias a la misma.
- Señal emisor se cierra el archivo de bloqueo de edad. Esto también libera el bloqueo.
- Señal receptores toda despertador porque ahora pueden obtener sus bloqueos de lectura. receptores
- señal deben cerrar el archivo que acaban de obtener un bloqueo en. No se volverá a utilizar. Si quieren esperar a que la condición de que vuelva a suceder que deberían volver a abrir el archivo.
En el emisor de señales, el archivo de bloqueo temporal que ha sido renombrado sobre la parte superior del archivo de bloqueo original, ahora se convierte en el nuevo archivo de bloqueo actual.
Opción utilizando la red de multidifusión
tienen los receptores de unirse a un grupo de multidifusión y esperar a que los paquetes. Tener los paquetes UDP enviar la señal del emisor a ese grupo de multidifusión.
Se puede unirse tanto el envío y recepción de sockets UDP a la interfaz de bucle invertido si lo desea utilizar la comunicación único huésped-local.
Otros consejos
Al final utiliza un socket de dominio Unix unido. El propietario mantiene una serie de FDs cliente y envía cada mensaje cuando hay un evento.