学习目的:

熟悉linux下scandir函数的使用

1、函数的功能

遍历指定目录下满足某种过滤模式的文件,返回结果可通过指定函数进行排序,并将返回的子目录信息(不递归遍历子目录的目录)存放到函数内部动态分配的内存中,我们可通过访问返回结果获取当前路径下目录的信息。

2、函数的原型

int scandir(const char *dirp, struct dirent ***namelist,int (*filter)(const struct dirent *),int (*compar)(const struct dirent **, const struct dirent **));

dirp: 指定扫描的目录

namelist:  struct dirent结构体类型的三级指针,用于获取该函数内部为存放返回结果的分配的动态内存

scadir函数内部使用malloc动态分配内存,用以保存遍历到的目录相关信息,动态分配内存结构如图2-1所示。分配的内存包含两个部分,一部分是struct dirent类型指针(一段连续内存,可看成指针数组),用于指向malloc分配用来存放目录信息内存地址,另一部分是malloc分配struct dirent大小内存,存放遍历目录或文件的相关信息。若想获取目录相关信息,需要先获取指向该存放内存的指针,即图2-1中的strcut dirent *arr[N]指针数组地址。

图2-1 scandir函数内部存储目录动态内存描述

filter: 函数指针,指向过滤模式函数。当filter指针设置为NULL时,扫描dirp目录下的所有顶层文件

compar: 函数指针,指向对遍历结果进行排序函数,alphasort函数和versionsort是经常用到的函数,alphasort根据字母先后对返回结果进行排序

3、函数使用

scandir_test.c----->参考man page提供代码

#define _SVID_SOURCE

/*print files in current directory in reverse order*/#include

int main(void)

{struct dirent **namelist;intn;

n= scandir(".", &namelist, NULL, alphasort);if (n < 0)

perror("scandir");else{while (n--)

{

printf("%s\n", namelist[n]->d_name);

free(namelist[n]); //------------------------>①每访问完一条目录或文件信息,释放由malloc分配的用于存放该信息的动态内存

}

free(namelist); //------------------------>②访问完指定目录下所有目录或文件信息内容,释放malloc分配的用于索引的指针数组内存

}

}

注:使用scandir函数获取相关信息之后,务必像上述代码①、②所示调用free函数释放内部由malloc分配内存(内存结构描述如图2-1所示)

linux scandir函数,Linux的scandir函数相关推荐

  1. linux的scandir函数,linux C++ scandir 的使用

    () 头文件 #include () 函数定义 int scandir(const char *dir,struct dirent **namelist,int (*filter)(const voi ...

  2. linux协议栈skb操作函数,linux协议栈skb操作函数

    1,struct sk_buff数据结构 struct sk_buff{ //这两个结构必须放在最前面 struct sk_buff *next; struct sk_buff *prev; stru ...

  3. linux动态库注册函数,Linux动态库函数的详解

    linux动态库函数的详解 加载动态库 void *dlopen(const char *filename, int flag); flag的可能值: rtld_lazy rtld_now rtld_ ...

  4. linux receive函数,Linux网络 - 数据包的接收过程

    的方式写入到指定的内存地址,该地址由网卡驱动分配并初始化.注: 老的网卡可能不支持DMA,不过新的网卡一般都支持. 3: 网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了 4: CPU根据中断表 ...

  5. linux内核提供的内存操作函数

    1.kmalloc()/kfree()         static __always_inline void *kmalloc(size_t size, gfp_t flags)         内 ...

  6. Linux中assert头文件,linux系统下如何使用assert函数

    linux系统下如何使用assert函数 只要看得懂程序的人都知道assert,在Windows下使用VC编写,使用assert之后,只需在IDE中设置为debug版或者是release版,编译器就会 ...

  7. linux的阻塞waitqueue,Linux阻塞控制 wait_event与wait_event_interruptible函数详解

    Linux阻塞控制 wait_event与wait_event_interruptible函数详解 最近研究了一下linux驱动对进程的阻塞与非阻塞的控制,感觉linux对进程的控制真的是牛逼,各种进 ...

  8. php函数scandir_使用PHP函数scandir排除特定目录

    scandir()函数返回一个数组,其中包含指定路径中的文件和目录.如下所示: 例子: print_r(scandir('test_directory')); ?> 输出: Array ( [0 ...

  9. 【Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配的内存 )

    文章目录 一.Linux 内核 动态分配内存 系统接口函数 二.统计输出 vmalloc 分配的内存 一.Linux 内核 动态分配内存 系统接口函数 Linux 内核 " 动态分配内存 & ...

  10. 【Linux 内核】调度器 ⑥ ( task_woken 函数 | set_cpus_allowed 函数 | rq_online 函数 | rq_offline 函数 )

    文章目录 一.task_woken 函数 ( 唤醒阻塞进程 ) 二.set_cpus_allowed 函数 ( 修改进程在 CPU 中的亲和力 ) 三.rq_online 函数 ( 启动执行队列 ) ...

最新文章

  1. iOS 后台下载及管理库
  2. mongoDB条件操作符
  3. 1.17 局部内部类
  4. Java中集合(六)Queue
  5. SQL中cross join,left join,right join ,full join,inner join 的区别
  6. 企业分布式微服务云SpringCloud SpringBoot mybatis (十)Spring Boot多数据源配置与使用Spring-data-jpa支持...
  7. 自己使用的一个.NET轻量开发结构
  8. jzoj1273-袁绍的刁难【进制转换】
  9. html约束验证的例子,HTML5利用约束验证API来检查表单的输入数据的代码实例
  10. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的物资管理系统
  11. 360解压电脑版安装包_迅捷pdf转换器电脑版安装包下载-迅迅捷pdf转换器安装包免费下载...
  12. go语言和java比_python与java、php、go的优势对比,各语言不要引起恐慌哈
  13. 雷电3菊链功能_同轴科技推出5款USB-C全功能数据线,清一色内置同轴线缆
  14. 离线语音控制并不等于本地语音识别
  15. C语言之pthread_cond_wait()和pthread_cond_timedwait()区别(十五)
  16. 原创Maya mel系列插件推荐
  17. HTTPS 免费证书,免费 ssl 证书,FreeSSL.org 申请多种免费证书
  18. python人民币转大写_Python人民币大写转换代码
  19. CSS解决图片过大撑破DIV的方法
  20. python创建一个列表、用于存储同学姓名_python学习日记04,Python

热门文章

  1. 利用Word的表格控制编制试卷头
  2. 缓和曲线06七次四项式
  3. vue判断是否登录,若未登录跳转登录页
  4. 小米/红米开启游戏消息屏蔽
  5. WORDLE猜词辅助器
  6. 你的团队是池塘?还是舰队?
  7. 鞍山python培训班
  8. 2023年准备报考软考,考哪个?
  9. 一次磁盘占用率 100% 的排查记录
  10. python导入excel表格给列命名_python-操作Excel表格