2016-05-30 173 views
-1

我有一些進程通過管道連接,所以stdout從一個是另一個stdin,反之亦然。我需要通過這個struct Message通過標準輸入和標準輸出,但我無法設法做到這一點。C++ - 進程之間發送消息

的結構:

strcut Task{ 
    bool some; 
    char text[MAX_TEXT_AREA]; 
} 

struct Stat{ 
    char text[MAX_TEXT_AREA]; 
    unsigned short id; 
} 

struct Message{ 
    int nTasks; 
    int nStats; 
    Task tasks[]; 
    Stat stats[]; 
} 

這就是我爲了把Message到stdout已經試過:

Message* m; //suppose it's initialized 
write(STDOUT_FILENO, m, sizeof(Message)); 
for(int i=0; i<m->nTasks; ++i) write(STDOUT_FILENO, m->tasks[i], sizeof(Task)); 
for(int i=0; i<m->nStats; ++i) write(STDOUT_FILENO, m->stats[i], sizeof(Stat)); 

我得到一些編譯錯誤,但我不知道如何解決此問題。有沒有辦法在不修改任何struct的情況下打印信息?

對於閱讀這是我有:

Message* m; 
while(read(STDIN_FILENO, m, sizeof(Message))){ 
    m->tasks = new Tarea[m->nTasks]; 
    m->stats = new Stat[m->nStats]; 
    for(int i=0; i<m->nTasks; ++i){ 
    m->tasks[i] = new Task; 
    read(0, m->tasks[i], sizeof(Task)); 
    }for(int i=0; i<m->nStats; ++i){ 
    m->stats[i] = new Stat; 
    read(0, m->stats[i], sizeof(Stat)); 
    } 
} 

一個進程創建的消息並打印出來,那麼其他進程讀取它,修改它,再打印到第一個過程(如一個戒指)等等。

同樣,我需要這個到write/read而不修改任何struct。謝謝。

+0

一個管道傳送一個字節流。因此,首先指定將在進程之間交換的字節格式。除非您在這方面有豐富的經驗和專業知識,否則在您指定之前不能編碼。實施前應記錄協議。 –

+0

我剛剛定義了兩個管道,使用了'dup2',因此stdin和stdout被重定向,就是這樣。該協議應該如何定義?這就是我要問的原因,因爲我沒有這方面的經驗。 – sant016

+0

@ sant016查找關於_data de-/serialization_以及來自相應庫的支持。 –

回答

0

你的錯誤是由於惡劣的呼叫read/write,例如,你寫道:

write(STDOUT_FILENO, m->tasks[i], sizeof(Task)); 

但第二寫入參數數量應該是一個地址,而task[i]是一個Task沒有地址。因此,更改爲:

write(STDOUT_FILENO, m->tasks+i, sizeof(Task)); 

write(STDOUT_FILENO, &(m->tasks[i]), sizeof(Task)); 

同樣的評論爲read

不要擔心「協議」,因爲你使用的過程之間的本地通信,同一臺機器上,寫在相同的語言時,一切都很好,直到...

----編輯 - ---

但你需要發送(至少)的任務和統計的數量,這樣做的:

write(STDOUT_FILENO, m, sizeof(Message)) 

是錯誤的,因爲它是不足以確定在該數組的大小另一端。您需要發送它們:

write(STDOUT_FILENO, m->nTasks, sizeof(m->nTasks)); 
write(STDOUT_FILENO, m->nStats, sizeof(m->nStats)); 

並相應地讀取它們。

+0

爲什麼這是不好的建議有很多原因。即使在同一臺機器上,您仍然需要指定數據的格式。否則,當它不起作用時,根本不可能知道哪一端出現故障。另外,仍然不能保證對方能夠理解數據的原因很多,包括數據可能沒有固定的大小,比如他的'Message'結構。 –

+0

你說得對,他沒有發送任務和統計數字。 –

+0

感謝您的回答。 嗯..直到...? – sant016