2016-03-04 66 views
0

我寫了一個用fork()創建多個進程的程序。現在我試圖讓它每次調用fork()時,只有原始的父進程生成子進程。例如,如果我給出4的論點,我應該讓所有4個ppid都是相同的,並且它的孩子。C - 原始父進程的子代

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

int main(int argc, char **argv) { 

    int i; 
    int n; 
    int num_kids; 

    if(argc != 2) { 
     fprintf(stderr, "Usage: forkloop <numkids>\n"); 
     exit(1); 
    } 

    num_kids = atoi(argv[1]); 

    for(i = 0; i < num_kids; i++) { 
     n = fork(); 
     if(n < 0) { 
      perror("fork"); 
      exit(1); 
     } else if (n == 0) { 
      exit(i); 
     } 
     printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i); 
    } 

    return 0; 
} 

當我運行這一點,每個PPID是相同的,但每個孩子的PID是一樣的好。如果我給4作爲我的說法,我得到:

pid = 19765, ppid = 18449, i = 0 
pid = 19765, ppid = 18449, i = 1 
pid = 19765, ppid = 18449, i = 2 
pid = 19765, ppid = 18449, i = 3 

如果孩子PID的都是相同的,或者是有什麼錯我的代碼?

+0

子進程退出的馬上,做這些打印輸出的過程是父進程(每次都是相同的進程)。 – skyking

+0

請不要污衊你的問題。 – rene

回答

2

不要與fork()返回值困惑:

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

int main(int argc, char **argv) { 

    int i; 
    int n; 
    int num_kids; 

    if(argc != 2) { 
     fprintf(stderr, "Usage: forkloop <numkids>\n"); 
     exit(1); 
    } 

    num_kids = atoi(argv[1]); 

    printf("parent pid = %d\n", getpid()); 
    for(i = 0; i < num_kids; i++) { 
     n = fork(); 
     if(n < 0) { 
      perror("fork"); 
      exit(1); 
     } 
     else if (n == 0) { // child process 
      printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i); 
      exit(i); 
     } 
    } 

    return 0; 
} 

輸出:頭

parent pid = 54981 
pid = 54982, ppid = 54981, i = 0 
pid = 54983, ppid = 54981, i = 1 
pid = 54984, ppid = 54981, i = 2 
pid = 54985, ppid = 54981, i = 3 
0
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/types.h> 

順序不正確。 sys/headers不僅應該總是先行,getpid和getppid的manpage特別將sys/types.h放在unistd.h之上。

int main(int argc, char **argv) { 

    int i; 
    int n; 
    int num_kids; 

    if(argc != 2) { 
     fprintf(stderr, "Usage: forkloop <numkids>\n"); 
     exit(1); 
    } 

    num_kids = atoi(argv[1]); 

    for(i = 0; i < num_kids; i++) { 
     n = fork(); 

n是孩子的pid的壞名字。

 if(n < 0) { 
      perror("fork"); 
      exit(1); 
     } else if (n == 0) { 
      exit(i); 

錯誤。應該是_Exit。

 } 
     printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i); 

此行由您的原始過程執行。也許你想在孩子身上執行它。但孩子剛剛退出。 }

return 0; 
} 
1

This鏈接說明了你的東西。

在你的情況,當你寫的行

printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i); 

這條線是由父進程處理,而不是子進程。 變量「n」存儲fork創建後的返回值(創建成功時爲0)。所以爲了獲得孩子的進程ID,你必須把你的代碼放在裏面

else if (n == 0) { //child process 
     exit(i); 
    } 

希望它有幫助。