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

如何在Linux系统下使用C语言创建子进程?

实现方案:用fork()创建父子进程并执行指定命令

这里有一个完整的C语言实现,完全匹配你的需求:

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

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

    // 处理fork失败的情况
    if (pid == -1) {
        perror("fork failed");
        return 1;
    }
    // 子进程分支
    else if (pid == 0) {
        printf("子进程启动:执行 traceroute www.google.com\n");
        // 替换子进程镜像为traceroute命令
        execl("/usr/bin/traceroute", "traceroute", "www.google.com", (char*)NULL);
        // 只有execl失败时才会走到这里
        perror("子进程中execl执行失败");
        return 1;
    }
    // 父进程分支
    else {
        printf("父进程等待子进程执行完毕...\n");
        // 等待子进程退出,避免僵尸进程
        wait(NULL);
        printf("子进程完成,父进程启动:执行 cat f1.c\n");
        // 替换父进程镜像为cat命令
        execl("/bin/cat", "cat", "f1.c", (char*)NULL);
        // 只有execl失败时才会走到这里
        perror("父进程中execl执行失败");
        return 1;
    }

    return 0;
}

关键部分解释

  • fork() 创建进程:

    • 调用fork()后,系统会复制当前进程(父进程)生成一个子进程,两者从fork()的下一行代码开始执行,但拥有各自独立的内存空间。
    • 返回值pid用于区分进程:-1表示创建失败;0表示当前处于子进程;大于0的数值是子进程的PID,当前处于父进程。
  • execl() 替换进程镜像:

    • 这个函数会把当前进程的代码和数据完全替换成指定的命令程序,执行成功后原进程的后续代码不会再运行。
    • 参数说明:第一个是命令的绝对路径(可以用which traceroute或which cat在终端确认路径);第二个是命令名称(对应argv[0]);后面是命令的参数;最后必须用(char*)NULL结尾标记参数列表结束。
  • wait(NULL) 的作用:

    • 父进程调用这个函数会暂停执行,直到子进程结束,既可以避免子进程变成僵尸进程,也能保证子进程的traceroute输出先完成,再执行父进程的cat命令。如果不需要顺序执行,可以去掉这一行,让父子进程并行运行。

编译和运行步骤

  1. 把上面的代码保存为process_demo.c
  2. 用gcc编译:
    gcc -o process_demo process_demo.c
    
  3. 运行程序:
    ./process_demo
    

注意事项

  • 确保你的系统安装了traceroute工具(Debian/Ubuntu系可以用sudo apt install traceroute安装)。
  • 确保当前目录下存在f1.c文件,否则cat命令会输出文件不存在的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:15:19