¿Qué es una buena manera portátil para poner en práctica un evento signalable global en un entorno POSIX

StackOverflow https://stackoverflow.com/questions/4326211

  •  29-09-2019
  •  | 
  •  

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.

¿Fue útil?

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) con F_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) con F_RDLCK o flock(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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top