2014-02-18 61 views
0

我一直在谷歌搜索有關我的問題2天,但即時通訊完成。我有關於進程管理,fork等非常基本的信息。我被告知創建一個同一父進程的一些子進程,並通過使用管道向它們發送種子,以便它們可以產生一些隨機數,這些都是爲了他們自己的。但我堅持創建子進程。讓孩子進程等待另一個循環

for (i = 0; i < NUM_PLAYERS; i++) { 
    /* TODO: spawn the processes that simulate the players */ 
    switch(pid = fork()){ 
     case -1: // ERROR 
      exit(EXIT_FAILURE); 

     case 0: // CHILD PROCESS 
      printf("My parent id is %d \n", getppid()); 
      exit(EXIT_SUCCESS); 

     default: // PARENT PROCESS 
      wait(NULL); 
    } 
} 

當我使用此代碼去,父母創造NUM_PLAYERS孩子,但我似乎不能在另一個使用它們for循環,因爲他們在案件0年底已經終止。當我剛剛刪除exit(EXIT_SUCCESS);線,創建了很多流程,並且擁有所有不同的父母。所以我的問題是,如何正確地創建子進程並在以後使用它們?

回答

2
void do_something() 
{ 
    //create random numbers or whatnot 
} 

// ...........

case 0: // CHILD PROCESS 
    printf("My parent id is %d \n", getppid()); 
    do_something(); 
    exit(EXIT_SUCCESS); 

你需要對孩子的父母wait在以後的循環。你擁有它的方式會阻止,直到一個孩子回來。您希望在此之前創建多個子女。

請注意,您仍然需要添加管道邏輯,以便父/子可以進行通信。

編輯

這是你需要做的大致輪廓:

for (i = 0; i < NUM_PLAYERS; i++) { 
    /* TODO: spawn the processes that simulate the players */ 
    switch(pid = fork()){ 
     case -1: // ERROR 
      exit(EXIT_FAILURE); 

     case 0: // CHILD PROCESS 
      printf("My parent id is %d \n", getppid()); 
      exit(EXIT_SUCCESS); 
    } 
} 

// only the parent will ever execute below here 

for (i = 0; i < NUM_PLAYERS; i++) 
{ 
    while (/* read each child's pipe*/) 
    { 
     //do something with data 
    } 
} 

for (i = 0; i < NUM_PLAYERS; i++) 
    wait(NULL); 

return(0); 
+0

我其實不知道該怎麼做。我應該刪除'wait(NULL);'並將它放在另一個循環中嗎? –

3

如果刪除exit(EXIT_SUCCESS)您的孩子將繼續執行它被分叉,也就是說,它會回到循環的大括號,並自己生成新的孩子。你想要孩子做什麼?你應該做到這一點,然後做exit(EXIT_SUCCESS),不要讓它返回到for()循環。

還要注意wait()只會等待一個進程退出。

+0

我需要通過一個管道發送一些種子,並調用一個名爲'void shooter(int id,int seed_fd_rd,int score_fd_wr)'的函數,所以我想我需要讓它們等待其他for循環。但我不知道如何讓它們等待並在當前for循環下方的另一個for循環中訪問它們。 –