2009-12-15 14 views
7

Sto cercando un leggero, modo semplice e veloce da gestire Inter Communication Process tra alcuni programmi su una macchina Linux.Inter-Process Communication Raccomandazione

Attualmente, sto pensando named pipe, perché è fornito dal sistema operativo stesso. Ci sono avvertenze circa le prestazioni o l'usabilità?

Would Shared Memory essere meglio?

Non credo che ho bisogno di un quadro super-complesso.

favore mi punto nella giusta direzione, grazie!


Aggiornamento: Voglio costruire un piccolo programma (demone) che racconta altri programmi (cui si inizia) per mettere in pausa, riportano il loro stato ritorno, sosta ecc

Così l'altro programma dovrebbe essere avvisati che un nuovo comando lo sta aspettando. Una pipa non è l'ideale, vero?

risposta

4

Boost ha una bella libreria InterProcess multi-piattaforma e abbastanza intuitiva.

Tuttavia, ci ho pensato solo, quindi potrebbero esserci alternative migliori.

Tuttavia, se non si ha realmente bisogno di memoria condivisa, rimango con un approccio di messaggistica. Eviterete deadlock e condizioni di gara. Il principio del pipe è davvero eccezionale e consente anche comportamenti pigri che potrebbero far risparmiare parecchio tempo a seconda della materia in questione!

+0

Sembra interessante. Darei un'occhiata a questo. Mi sembra sempre di dimenticare di dare un'occhiata alle librerie di boost. – brandstaetter

10

Come avete visto, è possibile utilizzare per la comunicazione tra processi:

  • Memoria condivisa
  • named pipe/prese UDP (eventualmente quelle locali)
  • TCP

Memoria condivisa ha il vantaggio delle prestazioni, perché non si dispone di alcun buffer durante l'invio/ricezione di messaggi. Ma devi sincronizzare i tuoi scambi di dati con un altro IPC. Può essere semafori IPC o ... named pipe or socket.

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

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

Per lo scambio synchro/buffer, preferisci TCP come più affidabile.

Non faccio uso di named pipe come preferisco presa per la possibilità di utilizzare communicationand del computer, tra l'naturalmente è possibile trovare un sacco di librerie di socket portatili ...

my2cents

EDIT:

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

+0

Mi piacerebbe avere qualcosa senza utilizzare l'overhead dello stack TCP, poiché sono necessarie prestazioni ottimali. Useremo il TCP anche per comunicare con altre macchine, ma localmente qualcosa di più veloce sarebbe l'ideale. – brandstaetter

+1

@brandstaetter: in questo caso, il mem condiviso è la via. Più grandi sono i dati, migliore è il guadagno in termini di prestazioni. Altri IPC (e socket) devono bufferizzare, anche se sono ottimizzati. Con il mem condiviso sei sicuro che non ci sia un sovraccarico del buffer. Utilizziamo i mem condivisi per lo scambio di immagini. La sincronizzazione può essere eseguita con una named pipe o un socket (locale), più facile da gestire rispetto a un semaforo condiviso (e più portatile). Puoi anche fare a meno del protocollo dati/scambio ... – neuro

+0

+1 per il livello di astrazione –

1

userei prese UNIX o qualche libreria che li avvolge. Gli zoccoli Unix sono piuttosto facili da usare.

D'altra parte se si dispone di informazioni sullo stato di dimensione fissa da riportare, si può semplicemente fare in modo che i processi figlio lo scrivano in un file (presumibilmente è piccolo e non lo si fsync, quindi non genererà carico di lavoro IO significativo).

+0

+1: sì, perché no un file. Non è il modo migliore per sincronizzare, ma puoi utilizzare un marcatore/contatore per la sincronizzazione. – neuro

4

Una buona scelta è quella di utilizzare socketpair, molto veloce ed efficiente.

+0

+1 ah sì buon punto – neuro

1

memoria condivisa con i semafori è il più veloce e più trasparente se ti piace per costruire il software fin dalle primitive.

named pipe non sono troppo diversi da tubi e funzionano bene tra una coppia di processi e non un server e molti clienti.

Se vi piace a sviluppare infrastrutture esistenti, dBus è un'opzione.

comunicazione Socket è versatile e scale bene se si desidera spostare le applicazioni tra gli host di una rete.

Problemi correlati