2014-03-31 120 views
0

我最近開始學習如何在C程序在Linux下,並寫了下面的代碼來創建一些過程:如何通過多進程訪問相同的變量C/C++

void generate() 
{  
    int pid; 

    for(int i=1;i<=10;i++) 
    { 
    pid = fork(); 
    } 

    if (pid<0) 
    { 
    printf("Error Fork"); 
    exit(1); 
    } 

    if(pid == 0) 
    { 
    printf("Fiu pid: %d --- Parinte pid: %d\n", getpid(), getppid()); 
    //count ++; 
    } 

    if(pid > 0) 
    { 
    printf("Parinte pid: %d\n", getpid()); 
    //count++; 
    wait(); 

    } 
} 

的問題是:如何我應該聲明/增加count變量以便打印函數創建的進程總數?

+0

@MadScienceDreams:這是必要的嗎?這是分叉進程,而不是創建線程。 –

+0

@FredLarson啊誤解了這個問題。我更像是一個線索般的人。 :-P – IdeaHat

+0

它實際上是一個家庭作業。這個問題聽起來像這樣: 以下代碼創建了多少個進程: for(i = 1; i <= 10; i ++) fork(); 不使用公式確定數字。只打印一次答案。 – DeiAndrei

回答

2

很簡單。 Fork爲每個父母生成一個孩子。因此答案是2^10或1024.

fork後面加一個printf並註釋掉其他無關輸出。運行方式

./a.out | sort | uniq | wc 

輸出是1024

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

void generate() 
{ 
    int pid; 

    for(int i=1;i<=10;i++) 
    { 
    pid = fork(); 
    printf("%d\n", getpid()); 
    } 

    if (pid<0) 
    { 
    //printf("Error Fork"); 
    exit(1); 
    } 

    if(pid == 0) 
    { 
    //printf("Fiu pid: %d --- Parinte pid: %d\n", getpid(), getppid()); 
    //count ++; 
    } 

    if(pid > 0) 
    { 
    //printf("Parinte pid: %d\n", getpid()); 
    //count++; 
    wait(NULL); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    generate(); 

    return(0); 
} 
+0

正確。循環的第一次迭代將1進程變成2,現在我在它們兩個中都是== 2。第二次迭代將2個進程中的每個進程轉換爲2個(共4個),現在我在它們四個中都是== 3。等等。 –

+0

@Duck我看到我在邏輯中犯了一個錯誤。我要撤回我的答案。謝謝你幫我弄明白。 –

+0

終端的輸出很好。但有沒有辦法只打印1024?我會問我的老師進一步的解釋。 – DeiAndrei

0

也許有更好的方法,但..你可以每一個孩子創造了時間追加新的行/字符到一個臨時文件。然後你只需要計算文件的行/字符。