Come passare interi tra due programmi C ++ usando IPC

1

Come si passa un numero intero tra due processi. Sono nuovo di IPC e utilizzo pipe so come trasferire la stringa tra due processi. Ma come posso passare un numero come quello? Posso farlo con la corda. Ma c'è un modo migliore per farlo?

E in che modo il prodotto del mondo reale fa queste cose? Ad esempio, browser chrome

    
posta getek mer 23.12.2018 - 20:36
fonte

1 risposta

3

Allo stesso modo di una stringa:

  1. codificandolo,
  2. trasferirlo tramite il meccanismo IPC,
  3. quindi decodificandolo.

Ora molti linguaggi di alto livello forniscono belle astrazioni senza interruzioni che consentono di leggere e scrivere oggetti da e verso le pipe. Stabiliscono per te un protocollo oggetto generico (o specifico) che si occupa della codifica / decodifica. Questo ti libera di concentrarti sugli oggetti specifici che desideri inviare / ricevere senza preoccuparti di come vengono inviati / ricevuti.

La maggior parte delle applicazioni attraversano questo percorso utilizzando queste astrazioni di alto livello perché generalmente sono collaudate, ben mantenute e riducono l'onere dei dettagli con cui devi lavorare. Questo includerebbe cose come SOAP, HTTP, SMTP, ecc ... Se puoi usarle.

A volte, però, perché vuoi imparare, o perché non esiste nulla di adatto, devi scrivere da solo quella libreria di adattatori.

Quindi prenditi un momento e considera cosa sta facendo realmente il pipe.

Il tubo nel suo nucleo sta prendendo una sequenza di unità e trasferendole dall'altra parte, con qualche garanzia (o mancanza) su come / quando / cosa viene consegnato. Le unità potrebbero essere bit, o forse gruppi di 8 bit. Sono possibili altri raggruppamenti e il tubo potrebbe persino usare il trinario. Per la maggior parte, gli 8bit tendono ad essere standard e una sequenza di questi è solo una matrice.

Quindi ora la domanda diventa come si mappano alcuni oggetti su una matrice di byte?

Beh, per una stringa questo può essere molto semplice. Perché una stringa è una matrice di caratteri e un carattere è memorizzato da uno o più punti di codice sequenziali. Se quei punti di codice sono byte come con UTF-8 o ASCII, allora una stringa è solo una matrice di byte.

Ora se i punti di codice sono più grandi di un byte, come può accadere?

Si noti che questo punto di codice è un numero intero di alcune dimensioni. Le dimensioni comuni potrebbero essere 16 bit, 24 bit, 32 bit, 64 bit o 128 bit. Questi sono tutti alcuni multipli di 8, quindi possiamo "codificare" un numero suddividendone i bit in byte e quindi inviando quei byte in un certo ordine. Il ricevitore ha solo bisogno di spostare quei bit indietro nelle posizioni corrette nell'intero all'altra estremità.

Quindi in che ordine devono essere inviati quei byte?

Qui è dove devi sapere come il computer memorizza interi. Questo è importante perché il numero esadecimale di 16 bit senza segno 0x8000 su little endian is: 128 , ma su big-endian is: 32768 . Quindi la maggior parte dei protocolli definisce qualcosa chiamato ordine di rete. Questo è l'ordinamento dei byte / bit in un numero intero sul wire e consente ai computer che memorizzano gli interi in modo diverso di inviare e ricevere ancora interi gli uni con gli altri.

Solitamente Big-Endian è usato come ordine di rete. Per lo più questo è storico, ma poiché è uno standard de facto, aiuta a ridurre la confusione e, soprattutto, l'ordine è intuitivo. In BigEndian il byte contenente la parte più significativa del numero viene inviato per primo, e così via fino a quando il byte con il valore più basso viene inviato per ultimo. Ad esempio se la rete ha inviato 3 cifre decimali e abbiamo avuto un numero di 3 unità:

+++ +++ +++
 12 730 234

Quindi, un grosso ordinamento di rete endian invierebbe un array come:

[ 12, 730, 234 ]

Viceversa Little endian sulla rete sarà simile a:

[ 234, 730, 12 ]

Protocolli e manipolazione dei bit

Avrai bisogno di ricercare i protocolli di comunicazione. In gran parte perché è necessario orchestrare la comunicazione tra il server e il client. Devono concordare su ciò che viene inviato / ricevuto in seguito in modo che non si confondano.

Dovrai anche cercare di manipolare Bit se vuoi scrivere la tua libreria di protocolli. Altrimenti avremo un'implementazione molto inefficiente (che va bene per l'apprendimento, non così bene per la produzione).

    
risposta data 24.12.2018 - 00:17
fonte

Leggi altre domande sui tag