如何在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命令。如果不需要顺序执行,可以去掉这一行,让父子进程并行运行。
- 父进程调用这个函数会暂停执行,直到子进程结束,既可以避免子进程变成僵尸进程,也能保证子进程的
编译和运行步骤
- 把上面的代码保存为
process_demo.c - 用gcc编译:
gcc -o process_demo process_demo.c - 运行程序:
./process_demo
注意事项
- 确保你的系统安装了
traceroute工具(Debian/Ubuntu系可以用sudo apt install traceroute安装)。 - 确保当前目录下存在
f1.c文件,否则cat命令会输出文件不存在的错误。
内容的提问来源于stack exchange,提问作者European Academy
相关产品推荐
相关产品推荐

