Дано прост въпрос. Опитвам се да науча едновременно 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, когато детето беше още живо.
Къде греша?