2013-03-09 119 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