希望是一个简单的问题。我正在尝试同时学习 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
在程序退出之前——也就是说,循环只运行一次。我在下面有一个检查,它正在出现 WIFEXITED() 所以这个过程应该已经正常退出了。但令我困扰的是,在此之前有一个 sleep(10) ,并且这会立即发生 - 更不用说子进程在剩余的等待时间内保持运行。
显然,我从根本上误解了一些东西。我的期望是父循环会阻塞,直到它看到来自孩子的角色,阅读它,然后检查它是否还活着。当孩子还活着的时候,我当然没想到 waitpid() 会设置 WIFEXITED。
我哪里错了?