Domanda

Ho un progetto che consiste in due processi e ho bisogno di passare alcuni dati tra loro in modo rapido ed efficace.

Sono consapevole del fatto che potrei usare i socket per farlo usando TCP, anche se entrambi i processi saranno sempre presenti sullo stesso computer, tuttavia questa non sembra essere una soluzione molto efficiente.

Vedo molte informazioni sull'uso di " pipe " su Linux. Tuttavia, lo voglio principalmente per Windows e Linux (preferibilmente tramite una libreria multipiattaforma), idealmente in un tipo sicuro, modo non bloccante.

Un'altra cosa importante è che ho bisogno di supportare più istanze dell'intera applicazione (cioè entrambi i processi), ognuna con la propria copia indipendente degli oggetti di comunicazione.

Esiste anche un modo multipiattaforma per generare un nuovo processo?

È stato utile?

Soluzione

Per IPC, Windows supporta named pipe proprio come Linux , tranne per il fatto che i nomi delle pipe seguono un formato diverso, a causa alla differenza nei formati di percorso tra i due sistemi operativi. Questo è qualcosa che potresti superare con un semplice preprocessore definito. Entrambi i sistemi operativi supportano anche IO non bloccanti su pipe e IO multiplexing con select ().

Altri suggerimenti

Dai un'occhiata a Boost.Interprocess

  

Boost.Interprocess semplifica l'uso dei comuni meccanismi di comunicazione e sincronizzazione tra processi e ne offre un'ampia gamma:

     
      
  • Memoria condivisa.
  •   
  • File mappati in memoria.
  •   
  • Semafori, mutex, variabili di condizione e tipi di mutex aggiornabili per posizionarli nella memoria condivisa e nei file mappati in memoria.
  •   
  • Versioni denominate di tali oggetti di sincronizzazione, simili all'API sem_open / CreateSemaphore di UNIX / Windows.
  •   
  • Blocco file.
  •   
  • Puntatori relativi.
  •   
  • Code dei messaggi.
  •   
     

Boost.Interprocess offre anche meccanismi di interprocesso di livello superiore per allocare porzioni dinamiche di una memoria condivisa o di un file mappato in memoria (in generale, per allocare porzioni di un segmento di memoria di dimensioni fisse). Utilizzando questi meccanismi, Boost.Interprocess offre strumenti utili per costruire oggetti C ++, inclusi contenitori simili a STL, nella memoria condivisa e nei file mappati in memoria:

     
      
  • Creazione dinamica di oggetti anonimi e denominati in una memoria condivisa o in un file mappato in memoria.
  •   
  • Contenitori simili a STL compatibili con file di memoria condivisa / mappati in memoria.
  •   
  • Allocatori simili a STL pronti per la memoria condivisa / file mappati in memoria che implementano diversi schemi di allocazione della memoria (come il pooling).
  •   
     

Boost.Interprocess è stato testato nei seguenti compilatori / piattaforme:

     
      
  • Visual 7.1 Windows XP
  •   
  • Visual 8.0 Windows XP
  •   
  • GCC 4.1.1 MinGW
  •   
  • GCC 3.4.4 Cygwin
  •   
  • Intel 9.1 Windows XP
  •   
  • GCC 4.1.2 Linux
  •   
  • GCC 3.4.3 Solaris 11
  •   
  • GCC 4.0 MacOs 10.4.1
  •   

Il vecchio TCP normale dovrebbe funzionare in modo abbastanza efficiente; a quanto ho capito, i moderni sistemi operativi rileveranno quando entrambe le estremità di una connessione TCP si trovano sulla stessa macchina e instraderanno internamente quei dati attraverso un meccanismo veloce, leggero (simile a un tubo) piuttosto che attraverso il normale stack TCP.

Quindi, se hai già un codice che funziona su TCP, dico di attenermi a ciò ed evito di spendere molto tempo di sviluppo extra per non molto payoff.

Potrebbe essere eccessivo, ma è possibile utilizzare Apache Portable Runtime; qui sono le funzioni thread e process.

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