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; }
补充说明
- 参数列表规范:
exec系列函数要求参数数组首元素指向被执行程序的路径/名称,这是UNIX标准约定,被调用程序可通过argv[0]获取自身执行名称。 - 错误检查:添加
execvp返回值检查,若返回则说明执行失败(如文件不存在、权限不足等),perror可打印具体错误原因。 - 输入校验:提前检查调用程序的参数数量,避免因参数不足引发后续错误。
被调用程序鲁棒性优化
建议给被调用程序也添加参数校验,避免因参数缺失崩溃:
#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
相关产品推荐
相关产品推荐

