2016-04-06 37 views
1

forkを使用した単純な親子プロセスプログラムを実装しています。私の目標は、単一の親からの子プロセスのユーザー入力数を作成し、そのPIDを動的配列に格納することです。私はフォークを使って子プロセスを作成してPIDSを保存します。しかし、私はPIDを格納するとき、私も0のPIDを格納し、私は他のPIDがプロセスに関連していると信じていますが、この数は子供と親よりもかなり大きいです。1つの親プロセスからの複数の子プロセス

これは明らかにこれが親プロセス内でのみ行われる場合に起こりますか?

void createProcesses(int nProcess) { 
    int i; 
    int PID; 
    processIDS = calloc(nProcess, sizeof(long)); 

    printf("*****Creating Processes*****\n"); 

    printf("Parent Process: PID %d\n", getpid()); 
    for (i = 0; i < nProcess; i++) { 
    PID = fork(); 
    if (PID == 0) { 
     printf("Child Process: PID %d\n", getpid()); 
     while(1){} 
    } 
    else if(PID != 0) { 
     // sleep(3); 
     // printf("Number of child processes created: %d\n", nProcess); 
     // updateProcessList(); 
     *(processIDS + i) = PID; 
     printf("%d\n", PID); 
    } 
    } 
    for(i = 0; i < sizeof(processIDS); i++) { 
    printf("%ld\n", *(processIDS + i)); 
    } 
    while(1) { 
    sleep(5); 
    updateProcessList(); 
    } 
} 

processIDS is a long * global variable. 

答えて

5

問題はここにある:

for(i = 0; i < sizeof(processIDS); i++) { 
    printf("%ld\n", *(processIDS + i)); 
    } 

processIDSがポインタであるので、それは大きさだあなたが望むものではありませんこれは、おそらく4または8、long *の大きさです。 nProcessの値がこれより小さい場合は、動的に割り当てられた配列の終わりを読み取って、未定義の動作を呼び出します。

あなたが作成したnProcessプロセスがある知っているので、あなたのループテストのためにそれを使用します。

for(i = 0; i < nProcess; i++) { 
    printf("%ld\n", *(processIDS + i)); 
    } 
+3

はまた、それがポインタベースの変異体よりも読みする方法より簡単です、[i]は 'processIDsを'使用することを検討してください。 – unwind

関連する問題