C语言fork子进程后调用exec传递任意数量参数的实现方法?
实现方案
核心思路
- 你当前用的
execl仅支持固定数量的入参,无法适配无固定限制的参数传递场景,替换为execv即可,该函数接受一个以NULL结尾的字符串数组作为目标程序的入参列表。 - C语言传入main函数的
argv数组本身末尾就是NULL,你只需要把argv从索引2的位置截断,得到的子数组刚好就是目标程序需要的完整入参列表(索引2是目标程序名作为其argv[0],后面的元素就是要传递的参数)。 - fork之后子进程中调用exec系列函数即可替换进程镜像,父进程可选择等待子进程执行结束。
完整实现代码
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> void run_prog(char *prog_path, char *const argv[]); int main (int argc, char *argv[]){ // 入参合法性校验,避免参数不足导致数组越界 if (argc < 3) { printf("参数不足,用法:%s <忽略文本> <目标程序路径> [目标程序参数...]\n", argv[0]); return 1; } pid_t pid = fork(); if (pid < 0) { perror("fork失败"); return 1; } else if (pid == 0) { // 子进程逻辑:运行目标程序 run_prog(argv[2], argv + 2); // exec系列函数执行成功不会走到这里,走到即为执行失败 perror("运行目标程序失败"); exit(1); } else { // 父进程逻辑:等待子进程执行结束 int status; waitpid(pid, &status, 0); printf("子进程执行完毕,退出状态码:%d\n", WEXITSTATUS(status)); } return 0; } void run_prog(char *prog_path, char *const argv[]) { execv(prog_path, argv); }
运行示例
比如你执行命令:
./my_prog ignore_this ls -l /tmp
上述代码会让子进程运行ls程序,传入参数-l和/tmp,输出/tmp目录的详细列表。
注意事项
- 如果目标程序不在当前工作目录,需要传入完整路径,或者你可以改用
execvp,该函数会自动从PATH环境变量中查找目标程序,只需要把execv替换为execvp即可,参数不需要改动。 - exec系列函数只有在执行失败的时候才会有返回值,执行成功后会直接替换当前进程的所有代码和数据,不会回到原程序的代码逻辑。
内容的提问来源于stack exchange,提问作者user16138525
相关产品推荐
相关产品推荐

