0

我正在编写将一个进程分成两部分的代码,然后父进程通过管道将参数发送给 main 子进程。孩子一个一个地计算字符并打印出最终结果。然后父母应该使用waitpid()来收割孩子。

如果我删除子进程中的循环,那么将发生收获,但如果我将其留在(这是必要的),程序将执行并终止,但不会发生收获。我不知道这是为什么。任何帮助将不胜感激。这是一堂课的作业。谢谢!

这是我的代码:

    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;   

我也意识到这段代码没有错误检查......我只是想让它先工作......

4

1 回答 1

4

您必须告诉客户何时停止,您可以通过关闭管道来做到这一点。所以父进程必须做到:

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 )
                       ^^^^
于 2013-03-09T20:46:27.863 回答