Che cosa è un buon modo portabile per implementare un evento signalable globale in un ambiente POSIX

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

  •  29-09-2019
  •  | 
  •  

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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top