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

调用exec执行mkdir失败:两函数执行结果不一致问题排查

嘿,我来帮你揪出这个「Bad Address」错误的元凶!这种问题十有八九是和exec()系列函数的参数规则或者局部变量的字符串处理有关,我给你拆解几个最常见的坑:

1. 最容易踩的:exec()参数没以NULL结尾

execl()、execlp()这类可变参数的exec函数,必须用NULL作为参数列表的最后一项;而execv()、execvp()则要求参数数组的最后一个元素是NULL。如果漏了这个,函数会在内存里乱找下一个参数,大概率会碰到非法地址,直接触发「Bad Address」。

举个错误示例:

// 错误!execl最后没加NULL
execl("/bin/mkdir", "mkdir", new_dir);

正确的写法应该是:

// 必须加NULL终止参数列表
execl("/bin/mkdir", "mkdir", new_dir, NULL);

如果是用execv的话,参数数组要这样定义:

// 正确:数组最后一项是NULL
char *args[] = {"mkdir", new_dir, NULL};
execv("/bin/mkdir", args);

2. 局部字符串没正确终止

如果你的new_dir是局部字符数组,比如char new_dir[20];,要是没给它加字符串终止符'\0',exec()解析的时候会一直往后读内存,直到碰到随机的'\0',中间很可能读到非法内存区域。

比如这种错误写法:

char new_dir[8];
// strncpy如果没填满数组,不会自动加'\0'
strncpy(new_dir, "myfolder", 8);
execl("/bin/mkdir", "mkdir", new_dir, NULL);

解决办法要么手动加'\0',要么用strcpy(确保数组足够大),或者直接初始化数组:

// 初始化时自动加'\0'
char new_dir[] = "myfolder";

3. 不小心传了野指针/未初始化指针

如果你的new_dir是一个char*类型的局部变量,但没给它分配内存或者指向有效的字符串,那传给exec()的就是野指针,直接触发地址错误。比如:

// 错误:dir未初始化,是野指针
char *dir;
execl("/bin/mkdir", "mkdir", dir, NULL);

这种情况要确保指针指向有效的、已初始化的内存区域。

你可以对照这几点检查第二个函数,大概率能找到问题!

内容的提问来源于stack exchange,提问作者Jacob Barnes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:18:32