2016-08-29 86 views
0

這是我寫的使父進程等待其子進程的正確方法是什麼?

#include<stdio.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<iostream> 
#include<wait.h> 
int main(void){ 
    std::cout << "My process " << getpid() << std::endl; 
    int i; 
    for(i=0;i<2;i++){ 
     int j = fork(); 
     wait(NULL); 

     std::cout << "Process id :" << getpid() <<" and parent:"<< getppid()<< " and value returned is " << j <<std::endl; 
    } 
    return 0; 
} 

程序這是輸出我得到:

My process 5501 
Process id :5502 and parent:5501 and value returned is 0 
Process id :5503 and parent:5502 and value returned is 0 
Process id :5502 and parent:5501 and value returned is 5503 
Process id :5501 and parent:2828 and value returned is 5502 
Process id :5504 and parent:5501 and value returned is 0 
Process id :5501 and parent:2828 and value returned is 5504 

有人能解釋輸出給我嗎?該計劃的目的是以DFS方式「訪問」流程。但是,我不理解第三行返回的值是5503,並且爲什麼即使我僅運行兩次循環,是否創建了5504?提前致謝。

+0

你瞭解'fork'的操作嗎? –

+0

這個問題與'C++'無關 – alexeykuzmin0

+0

@OliverCharlesworth是的,我做 –

回答

0

5503被返回到調用fork()父母,因爲在父母,fork()返回PID的它是新創建的孩子,在孩子,則返回0。因此,您需要對fork()的返回值if進行測試,以測試您是否在父代或子代中,以便您可以僅在所需的代碼中運行後續代碼,否則它將在兩者中運行。

至於你的問題的第二部分,你需要檢查你是否在父母(或孩子,取決於你想創建第二個孩子的人)在fork ing之前(和等待 - 只能等待父母)(for循環的第二次迭代);如果你不這樣做,那麼父母和孩子(從第一次在第一次迭代中調用時)都會調用fork(),並且每個都創建另一個孩子。這就是爲什麼父母正在創建5504

+0

這些支票故意不存在。我意識到我的錯誤。我感到困惑,忘記跟蹤每個分支的原始父進程。無論如何,感謝您的幫助。 –