2013-03-09 116 views
0

我正在编写将进程分为两部分的代码,然后父进程通过管道将参数发送给m​​ain。小孩一个一个地计算字符并打印最终结果。父母然后应该使用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; 

而且我知道有没有错误在此代码检查...我只是试图得到它的第一个工作...

+2

或换句话说,“为什么这个家长没有强奸孩子?” – 2013-03-09 20:45:46

+2

多么可怕的标题。 :( – 2013-03-09 20:46:02

+0

lmao ...哇我怎么没有看到... – user2152382 2013-03-09 20:54:59

回答

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) 
         ^^^^ 
+0

啊我看到了...谢谢你的帮助,解决了这个问题! – user2152382 2013-03-09 20:53:37

+1

然后标记为答案,并给予积分! – 2013-03-09 20:54:28

+0

我有一个倒数计时器接受... – user2152382 2013-03-09 20:58:55