c - 调用 globfree() 时出现分段错误
问题描述
[使用 arm-hisiv300-linux-gcc 编译基于 Linux 的 Target board]
调用此函数时出现分段错误。
uint32_t dir_disp(void)
{
uint32_t err;
uint32_t i;
size_t cnt;
char *str;
char **p;
glob_t glob_results;
err = glob("/home/2019-11-12/H*", GLOB_MARK, 0, &glob_results);
p = glob_results.gl_pathv;
cnt = glob_results.gl_pathc;
for (i=0; i<cnt; i++)
{
printf("[DEBUG] dir_disp: %s\n",p[i]);
}
globfree(&glob_results);
return 0;
}
上面的函数只从线程函数中调用一次,只有当有超过~100个项目匹配模式“ /home/2019-11-12/H*
”时才会发生分段错误
在以下情况下不会发生分段错误:
- 少于约 100 个与模式匹配的项目
- 或注释掉 for 循环中的 printf
- 或注释掉 globfree()
- 或在没有线程的另一个程序中调用该函数
[编辑]
对不起,但我忘了提到只有在打印所有与模式匹配的项目后才会发生段错误。
我检查了 ret valglob()
并发现它为零。不改变原来的问题。
解决方案
根据 Linux 手册页,glob()
它不是 MT 安全的,因此“在多线程程序中调用是不安全的”。
可能值得注意的是,Posix 确实需要glob()
MT 安全,因此该属性特定于 glibc 中的 Gnu 实现,并且可能与 Gnu 扩展有关,例如波浪号扩展选项。尽管如此,您应该注意警告。
根据您报告的症状,可能的问题是堆栈溢出,可能与实施中的alloca
VLA的使用有关glob
。(不过,我没有检查源代码;我没有特别证据表明实际使用了这些功能。)多线程代码中的默认堆栈大小往往非常小,在非 MT 环境中运行良好的代码很容易超过默认线程的堆栈大小。您可以在创建调用的线程时尝试增加堆栈大小glob
。
推荐阅读
- python - Python Pandas - 如果ID相同并且其中一行等于一个数字,则选择多行
- google-cloud-firestore - 向云函数中的文档添加数据:如何停止循环回调?
- dns - 如何在具有本地 DNS 服务器的本地网络上的 ansible awx 中生成动态主机清单
- python - 寻找用于在数据帧中实现逻辑的 for 循环的替代方案
- javascript - javascript-es6:无法解构对象数组。意外的令牌错误
- r - 如何根据 R 中的相邻多边形填充缺失值?
- python-3.x - Python SQLite3 按特定字段列出表中的数据
- go - 将未编组的 yaml interface{} 转换为实际结构
- android - 无法通过android studio中的url在webview中打开pdf
- python - Python融化数据框