gpt4 book ai didi

c++ - 如何在 scandir 中参数化选择函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:40 26 4
gpt4 key购买 nike

scandir()函数扫描目录dir,调用每个目录条目上的 select() 作为“int(*filter)(const struct dirent *)”如何将模式值作为参数传递给过滤器中使用的 fnmatch(const char *pattern, const char *string, int flags) 函数?

这是我的示例代码

int my_selectgrf(const struct dirent *namelist)
{
int r = 0;
char my_pattern[] = "*.grf";
r = fnmatch(my_pattern, namelist->d_name, FNM_PERIOD);

return (r==0)?1:0;
}
scandir("/pub/data/grf", &namelist, my_selectgrf, alphasort);

我的目标是能够使用 my_pattern 作为输入参数。

最佳答案

简短的回答:你不能。这是一个极其糟糕的 API,像这样的东西最近在 2008 年才被添加到 POSIX 中(基于 glibc 中的糟糕设计),这真是太可耻了。这种无法对其进行参数化或向其传递上下文的 API 应该在 20 多年前就被废除。

尽管如此,还是有一些解决方法:

方法 1:使用全局变量,如果您的代码需要线程安全,请通过锁定确保一次只有一个线程可以使用具有给定扫描功能的 scandir。这当然是 序列化 用法,如果您真的想从多个线程调用该函数,这可能是 Not Acceptable 。

方法 2:使用线程本地存储,GCC __thread 关键字(或 C11 _Thread_local 关键字,遗憾的是 GCC 仍然不接受)或 POSIX pthread_setspecific 和系列。这是相当干净的,但不幸的是它可能不正确;如果 scandir 的实现在内部使用了多个线程,则该参数可能无法在某些返回扫描函数的调用中使用。目前,我不相信有scandir的多线程实现。

现在,更好的解决方案:

抛弃 scandir 并使用适当的 API 编写您自己的函数来做同样的事情。反正只有几行。

关于c++ - 如何在 scandir 中参数化选择函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18780788/

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