C - 原始父进程的子级

时间:2016-03-04 06:27:34

标签: c

我编写了一个用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;
}

当我运行时,每个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是否全部相同,或者我的代码有问题吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

This链接为您解释了一些事情。

在你编写行

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

此行由父进程处理,而不是子进程处理。 变量&#34; n&#34;存储fork创建后的返回值(成功创建时为0)。因此,为了获得孩子的进程ID,您必须在

中输出代码
else if (n == 0) {  //child process
        exit(i);
    }

希望它有所帮助。

答案 2 :(得分:0)

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

标头的顺序不正确。 sys / headers不仅应该总是先行,getpid和getppid的联机帮助页特别将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;
}