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

Linux下C++调用外部.exe程序时execvp()触发核心转储问题求助

问题分析与解决方法

核心问题:execvp参数列表格式错误

UNIX/Linux系统中,execvp()传递的参数列表第一个元素必须是被调用程序的路径或名称(对应被调用程序main函数的argv[0]),你当前的参数列表直接传入argv[1]和argv[2],导致被调用程序的argv数组结构异常:

  • 执行main.exe 5 6时,argument_list为["5", "6", NULL]
  • 被调用程序program.exe启动后,argv[0]是"5",argv[1]是"6",argv[2]为NULL
  • 被调用程序中尝试读取argv[2]并执行atoi(NULL),触发未定义行为,直接导致核心转储。

另外,Linux下可执行文件通常不需要.exe后缀,虽不是崩溃直接原因,但建议遵循系统命名习惯。

修复后的调用程序代码

#include <iostream>
#include <unistd.h>

int main(int argc, char **argv)
{
    // 校验输入参数数量
    if (argc < 3) {
        std::cerr << "Usage: " << argv[0] << " num1 num2" << std::endl;
        return 1;
    }

    // 参数列表首元素为被调用程序路径,后续为实际传递的参数
    char *argument_list[] = {"./bin/program", argv[1], argv[2], NULL};   
    
    char *filename = "./bin/program";

    // execvp成功后当前进程会被替换,不会执行后续代码;返回则说明执行失败
    execvp(filename, argument_list);

    perror("execvp failed");
    return 1;
}

补充说明

  1. 参数列表规范:exec系列函数要求参数数组首元素指向被执行程序的路径/名称,这是UNIX标准约定,被调用程序可通过argv[0]获取自身执行名称。
  2. 错误检查:添加execvp返回值检查,若返回则说明执行失败(如文件不存在、权限不足等),perror可打印具体错误原因。
  3. 输入校验:提前检查调用程序的参数数量,避免因参数不足引发后续错误。

被调用程序鲁棒性优化

建议给被调用程序也添加参数校验,避免因参数缺失崩溃:

#include <iostream>
#include <cstdlib>

int main(int argc, char **argv)
{
    if (argc < 3) {
        std::cerr << "Usage: " << argv[0] << " num1 num2" << std::endl;
        return 1;
    }

    int a = atoi(argv[1]);
    int b = atoi(argv[2]);
    std::cout << a + b << std::endl;
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:20:43