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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 21:27:03