GNU/Linux >> Linux Esercitazione >  >> Linux

Raccomandazione sulla comunicazione tra processi

D-Bus è abbastanza utile e molto stabile per fare ipc nello stesso host.http://www.freedesktop.org/wiki/Software/dbus


Come hai visto, puoi usare per la comunicazione tra processi :

  • Memoria condivisa
  • Pipe con nome
  • Socket TCP/UDP (eventualmente locali)

La memoria condivisa ha il vantaggio delle prestazioni, perché non si dispone di alcun buffer durante l'invio/la ricezione di messaggi. Ma devi sincronizzare i tuoi scambi di dati con un altro IPC. Possono essere semafori IPC o ... pipe o socket con nome.

Quando le prestazioni non sono l'obiettivo principale, tendo a preferire i socket in quanto il loro utilizzo è semplice e può essere esteso alla comunicazione tra computer.

Il modo migliore è astrarre la tua comunicazione con una classe che può utilizzare la memoria condivisa quando i due processi si trovano sullo stesso computer e socket in caso contrario. Quindi devi scegliere tra UDP e TCP;-)

Per lo scambio sincrono/buffer, preferisci il TCP in quanto più affidabile.

Non uso named pipe in quanto preferisco socket per la possibilità di utilizzare la comunicazione tra computer e ovviamente puoi trovare molte librerie di socket portatili...

my2cents

MODIFICA:

Per la sincronizzazione, la memoria condivisa forse non è lo strumento migliore. Nel tuo caso può essere utilizzato condividendo un piccolo spazio di memoria, con uno spazio per ogni processo che attende comandi. Puoi eseguire il polling per qualsiasi comando in entrata o utilizzare un semaforo condiviso. Il modo più veloce è che i tuoi processi siano in attesa di semafori denominati e leggano uno spazio mem condiviso per i loro comandi/parametri. L'uso di pipe con nome è sicuramente più semplice ma non così veloce. Sicuramente non hai bisogno di essere così veloce? Ad ogni modo, astrai quello in una classe che modella il tuo protocollo di scambio e prova i due modi :-)


Una buona scelta è usare socketpair, molto veloce ed efficiente.


Boost ha una bella libreria InterProcess che è multipiattaforma e abbastanza intuitiva.

Ci ho solo giocato, quindi potrebbero esserci alternative migliori là fuori.

Tuttavia, se non hai davvero bisogno di memoria condivisa, mi atterrei a un approccio di messaggistica. Eviterai stalli e condizioni di gara. Il principio della pipa è davvero eccezionale e consente persino comportamenti pigri che potrebbero farti risparmiare un sacco di elaborazione a seconda della questione in questione!


Linux
  1. Comunicazione tra processi in Linux:socket e segnali

  2. Comunicazione tra processi in Linux:utilizzo di pipe e code di messaggi

  3. Comunicazione tra processi in Linux:archiviazione condivisa

  4. Esempi di comandi ipcs in Linux

  5. Come elencare i processi collegati a un segmento di memoria condivisa in Linux?

Come controllare la memoria condivisa di Linux usando il comando ipcs

Rileva librerie condivise obsolete in memoria con UChecker

Meccanismi di blocco per la consistenza della memoria condivisa

Memoria condivisa di Linux:shmget() vs mmap()?

Allocazione e deallocazione della memoria attraverso i limiti delle librerie condivise

Perché la memoria condivisa del kernel è 0 su Ubuntu 12.04?