2016-03-04 55 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); 
    } 

希望它有帮助。