うまくいけば、簡単な質問です。fork()、pipe()、waitpid() を同時に学習しようとしていて、いくつかの問題が発生しています。
if (pipe(myout)<0 || pipe(myin)<0 || pipe(myerr)<0) { perror("Couldn't make pipes"); return; }
int childpid=fork();
if (childpid==0) { //child
fdopen(myout[1], "w");
fdopen(myin[1], "r");
fdopen(myerr[1], "w");
dup2(myout[1], 1);
dup2(myin[1], 0);
dup2(myerr[1], 2);
printf("This should be seen\n");
fclose(stdout); fclose(stdin); fclose(stderr);
sleep(10);
_exit(0);
} else { //parent, wait on child
printf("parent, monitoring\n");
sim_out=fdopen(myout[0], "r");
sim_in=fdopen(myin[0], "w");
sim_err=fdopen(myerr[0], "r");
printf("have my fds\n");
int status;
do {
int ch;
if (read(myout[0], &ch, 1)>0)
write(1, &ch, 1);
else printf("no go\n");
waitpid(childpid, &status, WNOHANG);
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
}
私は得ています:
親、監視には私の fds T があります
プログラムが終了する前 - つまり、ループは 1 回だけ実行されます。その下にチェックがあり、WIFEXITED() が近づいているので、プロセスは正常に終了したはずです。しかし、私が気になるのは、それが起こる前に sleep(10) があり、これがすぐに起こることです-子プロセスが残りの待機時間の間実行されたままであることは言うまでもありません.
私は根本的に何かを誤解しています、明らかに。私の期待は、親ループが子からの文字を確認するまでブロックし、それを読み取り、それがまだ生きているかどうかを確認することでした. 私は確かに、子供がまだ生きているときに waitpid() が WIFEXITED を設定するとは思っていませんでした。
どこが間違っていますか?