You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言多进程咨询:能否通过多个含main的程序利用父进程ID实现?

关于多进程实现:多个带main的C程序的协作方式

答案是可以实现多进程机制,但并非直接通过“引用父进程ID”来创建进程,核心逻辑是让一个程序作为父进程,主动启动另一个独立程序的进程,子进程可以获取父进程的ID。具体细节如下:

核心原理

多进程的本质是操作系统负责创建和管理进程。单个程序用fork()是在同一进程的基础上复制出子进程;而多个独立带main的程序,需要由其中一个(父进程)通过系统调用启动另一个程序的进程(子进程),子进程运行的是第二个程序的代码,同时可以通过getppid()获取父进程的ID。

具体实现步骤(代码示例)

1. 父进程程序(parent.c)

这个程序负责创建子进程,并加载运行第二个程序的可执行文件:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t child_pid = fork();

    if (child_pid == -1) {
        perror("fork failed");
        return 1;
    }

    if (child_pid == 0) {
        // 子进程:加载并运行第二个程序(假设可执行文件名为child)
        execl("./child", "child", NULL);
        // 如果exec执行失败才会走到这里
        perror("exec failed");
        return 1;
    } else {
        // 父进程:等待子进程结束
        wait(NULL);
        printf("父进程(PID:%d)已等待子进程完成\n", getpid());
    }

    return 0;
}

2. 子进程程序(child.c)

这个程序作为独立的带main的程序,可以获取并打印父进程ID:

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t parent_pid = getppid();
    printf("子进程(PID:%d)的父进程ID是:%d\n", getpid(), parent_pid);
    // 这里可以编写子进程的业务逻辑
    return 0;
}

编译与运行

# 编译父程序
gcc parent.c -o parent
# 编译子程序
gcc child.c -o child
# 运行父程序
./parent

运行后会输出类似:

子进程(PID:12345)的父进程ID是:12344
父进程(PID:12344)已等待子进程完成

关键注意事项

  • 第二个程序不能主动通过引用父进程ID来创建进程,它本身是被父进程启动的子进程,只能被动获取父进程ID。
  • 如果直接单独运行第二个程序,它的父进程会是启动它的shell(比如bash),此时getppid()返回的是shell的PID,而非你预期的第一个程序的PID。
  • exec系列函数会替换子进程的内存空间,加载新程序的代码,一旦exec成功,子进程就不再运行父进程的代码,转而执行第二个程序的main函数。

内容的提问来源于stack exchange,提问作者user14856694

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:40:25