C fork()和原始父进程的子进程

C fork()和原始父进程的子进程,c,process,fork,C,Process,Fork,我编写了一个程序,用fork()创建多个进程。现在,我正试图使它在每次调用fork()时,只有原始父进程生成子进程。例如,如果我给出一个参数4,我应该让所有4个ppid及其子项都相同 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> int main(int argc, char **argv) { int i; i

我编写了一个程序,用fork()创建多个进程。现在,我正试图使它在每次调用fork()时,只有原始父进程生成子进程。例如,如果我给出一个参数4,我应该让所有4个ppid及其子项都相同

#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;
}

子pid是否都相同,或者我的代码是否有问题?

请不要与
fork()的返回值混淆:


不要与
fork()
的返回值混淆:

此行由原始进程执行。也许你想在孩子身上执行它。但这孩子刚刚离开。 }

    return 0;
}
此行由原始进程执行。也许你想在孩子身上执行它。但这孩子刚刚离开。 }

    return 0;
}
林克为你解释事情

在你写这句话的时候

 printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
此行由父进程而不是子进程处理。 变量“n”存储创建fork后的返回值(成功创建时为0)。因此,为了获得子进程的进程ID,您必须将内部代码取出

else if (n == 0) {  //child process
        exit(i);
    }
希望有帮助。

链接为您解释了一些事情

在你写这句话的时候

 printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
此行由父进程而不是子进程处理。 变量“n”存储创建fork后的返回值(成功创建时为0)。因此,为了获得子进程的进程ID,您必须将内部代码取出

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

希望有帮助。

子进程立即退出,进行打印输出的进程是父进程(每次都是同一进程)。请不要诋毁您的问题。子进程立即退出,进行打印输出的进程是父进程(每次都是同一进程).请不要诋毁你的问题。
        }
        printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
    return 0;
}
 printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
else if (n == 0) {  //child process
        exit(i);
    }