Che cosa è un buon modo portabile per implementare un evento signalable globale in un ambiente POSIX
Domanda
Il caso di utilizzo è quella applicazione genera un evento e invia un segnale che tutte le applicazioni che si preoccupa di ascoltare per l'otterrà. Per esempio. un'applicazione aggiorna il contenuto di un file e segnala questo. Su Linux questo potrebbe essere fatto dai camerieri di chiamata inotify sul file. Un modo portatile sarebbe per gli ascoltatori di registrarsi con un server ben noto, ma preferirei qualcosa di più semplice, se possibile. Il più portabile possibile significa idealmente usando solo POSIX caratteristiche che sono ampiamente disponibili anche.
Soluzione
Opzione utilizzare il blocco dei file
È possibile farlo bloccando un file.
segnale emettitore configurazione iniziale:
- Creare un file con un nome ben noto e bloccarlo per la scrittura (
fcntl(F_SETLK)
conF_WRLCK
o flock (LOCK_EX) `).
procedura di ricevitore di segnale:
- Apri il file utilizzando il nome noto e cercare di ottenere un blocco di lettura su di esso (
fcntl(F_SETLK)
conF_RDLCK
oflock(LOCK_SH)
). - blocchi ricevitore perché l'emettitore è in possesso di un blocco di scrittura contrastanti.
emissione del segnale:
- emettitore di segnale crea un nuovo file temporaneo
- emettitore di segnale ottiene un blocco di scrittura sul nuovo file temporaneo
- emettitore di segnale rinomina il nuovo file temporaneo al nome del file ben noto. Questo clobbers il file di blocco vecchio, ma i ricevitori aspettato tutta conservano i riferimenti ad esso.
- segnale emettitore chiude il file di blocco vecchio. Questo rilascia anche il blocco.
- segnale ricevitori tutto sveglia perché ora possono ottenere i loro blocchi in lettura. ricevitori
- segnale dovrebbe chiudere il file che hanno appena ottenuto una serratura. Non verrà utilizzato nuovamente. Se vogliono aspettare per la condizione che accada di nuovo che dovrebbe riaprire il file.
Nel emettitore di segnale, il file di blocco temporaneo che è stato rinominato sopra la parte superiore del file di blocco originale diventa ora il nuovo file di blocco corrente.
opzione utilizzando la rete multicast
avere il ricevitori aderire ad un gruppo multicast e di attesa per i pacchetti. Avere i pacchetti segnale emettitore di invio UDP a quel gruppo multicast.
È possibile associare sia l'invio e la ricezione UDP socket per l'interfaccia di loopback, se si desidera utilizzare la comunicazione solo host-locale.
Altri suggerimenti
Alla fine ho usato un socket di dominio unix legato. Il proprietario ha una serie di DF client e invia ogni un messaggio quando c'è un evento.