c - 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;
    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 应该都相同,还是我的代码有问题?

最佳答案

不要与 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

关于c - fork() 和原始父进程的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35789397/

相关文章:

Python:当 readline() 使用 Popen() 调用的进程时收到垃圾

c - 为什么这个 if 语句不起作用?

c - 什么种族导致输出看起来不同?

C 编译错误 - 表达式必须有常量值

ios - Udp套接字绑定(bind)失败

c - 在 C 中获取垃圾值的原因

android - 致命异常 : java. lang.RuntimeException:不支持同时使用来自多个进程的 WebView 和相同的数据目录

java - 尝试使用 Runtime.getRuntime().exec() 执行 Java jar

c - C 中的虚拟 Shell 在关闭外部进程后会出现问题

c - do While 循环不适用于 C 中的字符串比较