gpt4 book ai didi

c - 调用 globfree() 时出现段错误

转载 作者:行者123 更新时间:2023-11-30 14:34:47 25 4
gpt4 key购买 nike

[使用arm-hisiv300-linux-gcc编译基于Linux的目标板]

调用此函数时出现段错误。

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()
  • 或者在没有线程的情况下调用另一个程序中的函数

[编辑]

抱歉,我忘了提及仅在打印与模式匹配的所有项目后才会出现段错误。

我检查了 glob() 的 ret val,发现它为零。不改变原来的问题。

最佳答案

根据 Linux 联机帮助页,glob()not MT-safe就是这样"not safe to call in a multithreaded program" .

可能值得注意的是,Posix 确实需要 glob()为了 MT 安全,因此该属性特定于 glibc 中的 Gnu 实现,并且可能与 Gnu 扩展(例如波形符扩展选项)有关。尽管如此,您应该注意该警告。

根据您报告的症状,可能的问题是堆栈溢出,可能与 alloca 的使用有关。或 glob 中的 VLA执行。 (不过,我没有检查源代码;我没有具体证据表明实际使用了这些功能。)多线程代码中的默认堆栈大小往往非常小,并且在非 MT 环境中运行良好的代码很容易超过默认线程的堆栈大小。当您创建调用 glob 的线程时,您可以尝试增加堆栈大小.

关于c - 调用 globfree() 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58830466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com