2016-05-30 8 views
-1

私はいくつかのプロセスをパイプで接続しているので、stdoutはもう一方はstdin、viceversaはstdoutです。私はstdinとstdoutを使って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[]; 
} 

これは私がstdoutにMessageを置くために試みたものです:

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)); 
    } 
} 

1つのプロセスは、メッセージを作成し、それを印刷し、その後、他のプロセスは、それを読み込み、それを修正、などが挙げられる(最初のプロセスに再びそれを印刷します。これを読んでために

は、私が持っているものですリング)、など。

write/readこの場合も、structを変更することなくこの値を必要とします。ありがとう。 task[i]はのTaskないアドレスである一方で、書き込みの

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

が、第二引数は、アドレスでなければなりません:

+0

パイプはバイトのストリームを運びます。まず、プロセス間で交換されるバイトのフォーマットを指定します。これは、あなたがこの分野で豊富な経験と専門知識を持っていない限り、指定する前にコード化することはできません。プロトコルは実装される前に文書化する必要があります。 –

+0

私はちょうど2つのパイプを定義しており、 'dup2'を使ってstdinとstdoutをリダイレクトしています。そのプロトコルはどのように定義されるべきですか?これは私がこれについての経験がないので頼んでいる理由です。 – sant016

+0

@ sant016 _data de/serialization_のルックアップと適切なライブラリのサポート。 –

答えて

0

あなたのエラーは、例えば、あなたが書いた、read/writeに悪いの呼び出しによるものです。

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

または

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

readため同じ備考:だからに変更。あなたはプロセス間でローカル通信を使用しているので、

が同じ言語で書かれた同じマシン上で、「プロトコル」を心配しないで、すべてがOKである...まで

----編集 - で配列のサイズを決定するのに十分でないため、

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

関連する問題