パイプを使用して、子プロセスのstdinとstdoutをリダイレクトしたいと思います。
現在、私は次のコードを持っています:
void child(int pipeIn[], int pipeOut[]) {
char buff[20];
const char msg[]="Child Message\n";
close(pipeIn[1]);
close(pipeOut[0]);
if (dup2(pipeIn[0], 0))
perror("dup2 pipeIn");
if (dup2(pipeOut[1], 1))
perror("dup2 pipeOut");
close(pipeIn[0]);
close(pipeOut[1]);
for (int i = 0; i < 10; ++i) {
read(0, buff, 20);
fprintf(stderr, "Child: %s\n",buff);
printf("%s",msg);
}
}
void parent(int pipeIn[], int pipeOut[]) {
char buff[20];
const char msg[]="Parent Message\n";
close(pipeIn[0]);
close(pipeOut[1]);
for (int i = 0; i < 10; ++i) {
write(pipeIn[1], msg, 16);
read(pipeOut[0], buff, 50);
printf("Parent: %s", buff);
}
}
void test() {
int pipeOut[2],pipeIn[2];
if(pipe(pipeOut)) {
perror("pipeOut");
exit(1);
}
if(pipe(pipeIn)) {
perror("pipeIn");
exit(1);
}
int pid = fork();
if (pid == -1) {
perror("fork()");
exit(1);
}
else if (pid == 0)
child(pipeIn, pipeOut);
else
parent(pipeIn,pipeOut);
}
ただし、このコードは取得し続けるため機能しません
dup2 pipeOut:未定義のエラー:0
そして、それはデッドロックに陥ります。
親が子の応答(決して到着しない)を待ち続け、同じように子が決して到着しない入力を待ち続けるため、コードが停止することを理解しています。
私が理解していないのは、なぜ私がそのエラーを受け取り続けるのかということです。私は何か間違ったことをしていますか?
私はMacOSLion10.7.2とXcode4.2.1に取り組んでいます。
更新:Adam Rosenfieldの回答の後、ifステートメントを修正しました。しかし、私が言ったように、コードはまだ停止しています(私は子供が最初に印刷したものだけを読むことができ、他にはChild: Parent Message
何も読むことができません)。
なぜこれが起こっているのか考えていますか?