调用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
相关产品推荐
相关产品推荐

