我正在编写将一个进程分成两个进程的代码,然后父级通过管道将参数发送到 main 到子级。 child 一个一个地数字符,打印最后的结果。然后 parent 应该使用 waitpid() 收获 child 。
如果我去掉子进程中的循环,那么reap就会发生,但是如果我把它留在里面(这是必要的),程序执行并终止,但是reap不会发生。我不知道这是为什么。任何帮助将不胜感激。这是一门课的作业。谢谢!
这是我的代码:
if( waitpid( pid, &status, WNOHANG ) > 0 )
{
printf( "parent reaps child status 0x%08X\n", status );
if( WIFEXITED(status) )
printf( "child exited normally with %d\n", WEXITSTATUS(status) );
}
close( out );
return 0;
我还意识到这段代码中没有错误检查......我只是想让它先工作......
您必须告诉客户何时停止,您可以通过关闭管道来做到这一点。所以父进程必须做:
for( i = 0; i < (argc - 1); i++ )
{
for( idx = 0; idx < strlen(argv[i + 1]); idx++ )
write( out, &argv[i + 1][idx], 1 );
}
close(out); // <----
sleep(1);
if( waitpid( pid, &status, WNOHANG ) > 0 )
此外,如果子进程未完成,WNOHANG 会告诉 waitpid 不要等待。所以在你的情况下它还没有完成。
waitpid( pid, &status, WNOHANG )
^^^^
我是一名优秀的程序员,十分优秀!