Domanda

Non ho mai scritto alcun C ++ IPC su Linux prima.

Il mio problema è che avrò più client (scrittori) e un singolo server (lettore). Tutti questi saranno sulla stessa macchina. Gli autori forniranno blocchi di dati (una stringa / struttura) al lettore. Il lettore li leggerà in FIFO e farà qualcosa con loro.

I tipi di IPC su Linux sono Pipes o Socket / Code di messaggi per quanto ne so.

Mi stavo solo chiedendo se qualcuno potesse consigliarmi un percorso da percorrere. Mi sto inclinando verso le prese, ma non ho basi reali per quello. C'è qualcosa che dovrei leggere / capire prima di intraprendere questo viaggio?

Grazie

È stato utile?

Soluzione

Il problema principale che dovresti considerare è che tipo di dati stai trasmettendo in quanto questo determinerà in parte le tue opzioni. Questo dipende dal fatto che i tuoi dati siano limitati o meno. Se non è limitato, allora qualcosa di orientato al flusso come FIFO o socket è appropriato; in tal caso, è possibile utilizzare meglio cose come MQ o memoria condivisa. Dal momento che menzioni sia le stringhe sia le strutture, è difficile dire cosa sia appropriato nel tuo caso, anche se se le tue stringhe sono limitate entro un limite massimo ragionevole puoi usare qualsiasi cosa con qualche giochino minore.

Il secondo è la velocità. Non c'è mai una risposta completamente corretta per questo, ma in genere va qualcosa del genere: memoria condivisa, MQ, FiFO, socket di dominio, socket di rete.

Il terzo è la facilità d'uso. La memoria condivisa è la più grande PITA poiché devi gestire la tua sincronizzazione. I tubi sono facili purché la lunghezza del messaggio rimanga al di sotto della dimensione PIPE_BUF. Il sistema operativo gestisce la maggior parte dei mal di testa con MQ. Le prese sono abbastanza facili ma hai la piastra di installazione impostata.

Infine, molti dei meccanismi IPC hanno varianti POSIX e SYSV. In genere POSIX è la strada da percorrere a meno che il tipo SYSV non abbia alcune funzionalità di cui hai veramente bisogno o desideri.

EDIT: la risposta di Count0 mi ha ricordato che potresti essere interessato a qualcosa di più astratto e di livello superiore. Oltre a ACE puoi consultare Poco . E, naturalmente, nessuna risposta SO è completa se non menziona Potenzia da qualche parte.

Altri suggerimenti

System V IPC è piuttosto complicato da usare ma è una tecnologia matura e robusta. Le code dei messaggi probabilmente farebbero ciò che desideri e supporterebbero l'accodamento / decodifica atomica.

I socket sono facili da usare e supportano anche la comunicazione in rete. Tuttavia, non eseguono alcuna accodamento, quindi dovresti scrivere il codice di gestione delle code nel tuo server. L'uso dei socket con C ++ non è molto diverso dal loro utilizzo con C. Ci sono molte guide a questo in rete e libri come "Unix Network Programming (vol 1)" di Stevens che trattano questo argomento in modo approfondito.

Un buon posto per bagnarsi i piedi è questo tutorial sui socket .

Dovrai quindi analizzare le thread & amp; mutex e qui .

Con quanto sopra sei pronto per iniziare a giocare ;-)

Anche se non hai chiesto libri e poiché le risposte sopra sono così buone, suggerirò solo di mettere le mani su copie di questi due tomi:

Programmazione di rete UNIX, volume 2, seconda edizione: Interprocess Communications, W. Richard Stevens

Programmazione avanzata in ambiente UNIX, seconda edizione, W. Richard Stevens e Stephen A. Rago

Ci sono inevitabili ins & amp; con questo tipo di codifica, questi due libri ti aiuteranno a superare qualsiasi confusione.

Prova a dare un'occhiata a ACE (Adaptive Communication Environment) . Le librerie ACE sono disponibili gratuitamente, molto mature e multipiattaforma. Purtroppo una buona documentazione non lo è, consiglierei questo libro di cercare un buona soluzione Potresti provare a dare un'occhiata a questo tutorial per ottenere una sensazione degli schemi (alla fine del documento). ACE utilizza una serie di schemi per affrontare con successo ed efficienza questi problemi, specialmente in un contesto di rete, quindi dovrebbe essere un buon inizio per cercare buoni schemi e metodi da usare.

Soprattutto Ace_Task usando Message_Queue consenti di fare ciò di cui hai bisogno.

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