Надеюсь, простой вопрос. Я пытаюсь изучить одновременно 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 (), поэтому предполагается, что процесс завершился нормально. Но что меня беспокоит, так это то, что перед этим происходит сон (10), и это происходит немедленно, не говоря уже о том, что дочерние процессы остаются запущенными в течение оставшегося времени ожидания.
Я совершенно недопонимаю что-то, ясно. Я ожидал, что родительский цикл будет блокироваться, пока не увидит символ от дочернего, прочитает его, а затем проверит, был ли он еще жив. Я, конечно, не ожидал, что waitpid () установит WIFEXITED, когда ребенок еще жив.
Где я не прав?