2012-09-07 74 views
6

我的問題是:爲什麼我的進程不能同時運行?

1.)我怎樣才能讓父進程總是最後死去?我知道這是沒有完成的,因爲父母是第一個運行的pid,但我不知道如何改變它。

2.)我如何讓我的子進程與他同時執行?我甚至把這個數字看得很高,看看它是不是巧合,但它似乎不是。

編輯:SOLUTIONS

1)加入等待(NULL)在兩次內默認
2.)發生了什麼。用睡眠(1)來證明它。

我的代碼如下

#include <stdio.h> 
int main() { 
    int pid, i; 
    pid = fork(); 
    switch(pid) { 
     case -1: 
      // error 
      printf("Fork error"); 
      break; 
     case 0: 
      // child process 
      printf("First child is born, my pid is %d\n", getpid()); 
      for(i=1; i<10; i++) 
       printf("First child executes iteration %d\n", i); 
      printf("First child dies quietly.\n"); 
      break; 
     default: 
      // parent process 
      printf("Parent process is born, my pid is %d\n", getpid()); 
      pid = fork(); 
      switch(pid) { 
       case -1: 
        // error 
        printf("Fork error"); 
        break; 
       case 0: 
        // child process 
        printf("Second child is born, my pid is %d\n", getpid()); 
        for(i=1; i<10; i++) 
         printf("Second child executes iteration %d\n", i); 
        printf("Second child dies quietly.\n"); 
        break; 
       default: 
        // parent process 
        printf("Parent process dies quietly."); 
     } 
    } 
    return 0; 
} 

我總是輸出看起來像這樣:

 
Parent process is born, my pid is 7847 
First child is born, my pid is 7848 
First child executes iteration: 1 
First child executes iteration: 2 
First child executes iteration: 3 
First child executes iteration: 4 
First child executes iteration: 5 
First child executes iteration: 6 
First child executes iteration: 7 
First child executes iteration: 8 
First child executes iteration: 9 
First child executes iteration: 10 
First child dies quietly. 
Parent process dies quietly. 
Second child is born, my pid is 7849 
Second child executes iteration 1 
Second child executes iteration 2 
Second child executes iteration 3 
Second child executes iteration 4 
Second child executes iteration 5 
Second child executes iteration 6 
Second child executes iteration 7 
Second child executes iteration 8 
Second child executes iteration 9 
Second child executes iteration 10 
Second child dies quietly. 

我的任務是:

編寫一個C語言程序( 「procs.c」),其創建三個進程:創建兩個子進程的父進程。

的第一個孩子應該做到以下幾點:

  • 顯示「第一個孩子出生後,我的pid是......」

  • 顯示十倍的消息「第一個孩子來執行迭代X」 ,其中X是迭代次數

  • 顯示「第一個孩子安靜地死亡。」

第二個孩子應該做到以下幾點:

  • 顯示「第二個孩子出生後,我的pid是......」

  • 顯示十倍的消息「老二執行迭代X「,其中X是迭代次數

  • 顯示」第二個孩子安靜地死亡。「

父進程應該做到以下幾點:

  • 顯示 「父進程是天生的,我的pid是......」

  • 創建的第一個孩子

  • 創建第二個孩子

  • display「Parent過程悄然死亡。「

使用gcc編譯程序並將其命名爲可執行的‘特效’執行程序數次,並注意如何將兩個孩子的輸出隔行

這項計劃的一個可能的輸出是:。

 
nova> ./procs 

Parent process is born, my pid is 7847 
First child is born, my pid is 7848 
First child executes iteration: 1 
First child executes iteration: 2 
First child executes iteration: 3 
First child executes iteration: 4 
First child executes iteration: 5 
Second child is born, my pid is 7849 
Second child executes iteration 1 
Second child executes iteration 2 
Second child executes iteration 3 
First child executes iteration: 6 
Second child executes iteration 4 
Second child executes iteration 5 
Second child executes iteration 6 
First child executes iteration: 7 
Second child executes iteration 7 
Second child executes iteration 8 
Second child executes iteration 9 
Second child executes iteration 10 
Second child dies quietly. 
First child executes iteration: 8 
First child executes iteration: 9 
First child executes iteration: 10 
First child dies quietly. 
Parent process dies quietly. 

回答

3
  1. 合適的父進程應該等待(使用wait() or waitpid()或特定於平臺的變體)其孩子離開之前死亡。

  2. 併發執行需要調度程序有機會運行。您可以通過適當的睡眠(微睡眠,nano-sleep)操作來強制解決問題。一些系統調用會有幫助(所以fflush(0)可能會有所幫助)。


#include <stdio.h> 
#include <sys/wait.h> 
#include <time.h> 
#include <unistd.h> 

int main(void) 
{ 
    int pid, i; 
    struct timespec tw = { .tv_sec = 0, .tv_nsec = 10000000 }; 
    pid = fork(); 
    switch(pid) 
    { 
     case -1: 
      printf("Fork error"); 
      break; 
     case 0: 
      printf("First child is born, my pid is %d\n", getpid()); 
      for(i=1; i<10; i++) 
      { 
       printf("First child executes iteration %d\n", i); 
       nanosleep(&tw, 0); 
      } 
      printf("First child dies quietly.\n"); 
      break; 
     default: 
      printf("Parent process is born, my pid is %d\n", getpid()); 
      pid = fork(); 
      switch(pid) 
      { 
       case -1: 
        printf("Fork error"); 
        break; 
       case 0: 
        printf("Second child is born, my pid is %d\n", getpid()); 
        for(i=1; i<10; i++) 
        { 
         printf("Second child executes iteration %d\n", i); 
         nanosleep(&tw, 0); 
        } 
        printf("Second child dies quietly.\n"); 
        break; 
       default: 
        printf("Parent process waiting for children.\n"); 
        int corpse; 
        int status; 
        while ((corpse = waitpid(0, &status, 0)) > 0) 
         printf("Child %d died with exit status 0x%.4X\n", corpse, status); 
        printf("Parent process dies quietly.\n"); 
        break; 
      } 
    } 
    return 0; 
} 

輸出示例:

Parent process is born, my pid is 46624 
First child is born, my pid is 46625 
First child executes iteration 1 
Parent process waiting for children. 
Second child is born, my pid is 46626 
Second child executes iteration 1 
First child executes iteration 2 
Second child executes iteration 2 
First child executes iteration 3 
Second child executes iteration 3 
First child executes iteration 4 
Second child executes iteration 4 
Second child executes iteration 5 
First child executes iteration 5 
Second child executes iteration 6 
First child executes iteration 6 
Second child executes iteration 7 
First child executes iteration 7 
Second child executes iteration 8 
First child executes iteration 8 
Second child executes iteration 9 
First child executes iteration 9 
First child dies quietly. 
Second child dies quietly. 
Child 46625 died with exit status 0x0000 
Child 46626 died with exit status 0x0000 
Parent process dies quietly. 

注意,10點毫秒的延遲幾乎迫使交替執行。如果沒有類似的東西,你會被系統和調度程序的特質所困擾,許多現代化的機器太快了!

+0

我的書有一個和我一樣的例子,除了default還有一個for循環。結果通常看起來像parent1,parent2,child1,child2,child3,child4,parent3等。在我的第一個孩子的執行過程中,爲什麼不是第二個孩子開始執行? –

+1

你的機器速度太快了。 –

+0

謝謝。你的幫助激勵我將睡眠(1)放入我的孩子的過程中,以證明他們同時在跑步。 –

1

fork()創建一個新的子進程,從父,其運行的獨立。

如果你想父進程等待孩子們完成後,您可以使用系統調用wait,傳遞一個PID,這將阻塞,直到過程結束。

看文章wait(System Call) on Wikipedia

相關問題