首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让nftw()更快

如何让nftw()更快
EN

Stack Overflow用户
提问于 2020-01-11 01:46:06
回答 1查看 212关注 0票数 0

我正在做一个目录列表项目,我需要捕获计算机上的所有文件,然后将它们存储在一个队列中,然后将其发送给工作线程进行工作。

现在我使用的是this example code of nftw()

代码语言:javascript
复制
#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

static int
display_info(const char *fpath, const struct stat *sb,
             int tflag, struct FTW *ftwbuf)
{
    printf("%-3s %2d %7jd   %-40s %d %s\n",
        (tflag == FTW_D) ?   "d"   : (tflag == FTW_DNR) ? "dnr" :
        (tflag == FTW_DP) ?  "dp"  : (tflag == FTW_F) ?   "f" :
        (tflag == FTW_NS) ?  "ns"  : (tflag == FTW_SL) ?  "sl" :
        (tflag == FTW_SLN) ? "sln" : "???",
        ftwbuf->level, (intmax_t) sb->st_size,
        fpath, ftwbuf->base, fpath + ftwbuf->base);
    return 0;           /* To tell nftw() to continue */
}

int
main(int argc, char *argv[])
{
    int flags = 0;

   if (argc > 2 && strchr(argv[2], 'd') != NULL)
        flags |= FTW_DEPTH;
    if (argc > 2 && strchr(argv[2], 'p') != NULL)
        flags |= FTW_PHYS;

   if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
            == -1) {
        perror("nftw");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

我注意到它开始很快,然后很快就消失了,每循环1000个文件大约需要7秒。我正在寻找一种方法来提高这个功能的速度。

EN

回答 1

Stack Overflow用户

发布于 2020-01-11 01:53:27

在您所链接的页面中,有对此行为的解释:

nopenfd为了避免耗尽调用进程的所有文件描述符,

指定了ftw()将同时打开的最大目录数。当搜索深度超过此深度时,ftw()将变得更慢,因为必须关闭并重新打开目录。ftw()对目录树中的每个级别最多使用一个文件描述符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59686628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档