私はいくつかのプロセスをパイプで接続しているので、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));
が、第二引数は、アドレスでなければなりません:
パイプはバイトのストリームを運びます。まず、プロセス間で交換されるバイトのフォーマットを指定します。これは、あなたがこの分野で豊富な経験と専門知識を持っていない限り、指定する前にコード化することはできません。プロトコルは実装される前に文書化する必要があります。 –
私はちょうど2つのパイプを定義しており、 'dup2'を使ってstdinとstdoutをリダイレクトしています。そのプロトコルはどのように定義されるべきですか?これは私がこれについての経験がないので頼んでいる理由です。 – sant016
@ sant016 _data de/serialization_のルックアップと適切なライブラリのサポート。 –