使用READDIR和多线程下的READDIR_R读取目录

书上只说了用第一个函数在多线程下会不安全,

为什么不安全,也没有说,只是取嘛,现在想不太通。

是为记。。

 1 [root@localhost ccode]# cat readdir_exp.c
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <dirent.h>
 5
 6 int main(int argc, char *argv[])
 7 {
 8     DIR *dirp;
 9     struct dirent *dp;
10     dirp = opendir(argv[1]);
11     while((dp = readdir(dirp)) != NULL)
12     {
13         if(dp->d_name[0] == '.')
14             continue;
15         printf("inode = %d\t", dp->d_ino);
16         printf("reclen = %d\t", dp->d_reclen);
17         printf("name = %s\n", dp->d_name);
18     }
19     closedir(dirp);
20     return 0;
21 }
 1 [root@localhost ccode]# cat readdir_r_exp.c
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <dirent.h>
 5
 6 int main(void)
 7 {
 8     DIR *dirp;
 9     struct dirent *dp1 = malloc(sizeof(struct dirent));
10     struct dirent *dp2 = malloc(sizeof(struct dirent));
11     dirp = opendir(".");
12     while(1)
13     {
14         if((readdir_r(dirp, dp1, &dp2)) != 0)
15         {
16             perror("readdir");
17             exit(EXIT_FAILURE);
18         }
19         if(dp2 == NULL)
20             break;
21         if(dp2->d_name[0] == '.')
22             continue;
23         printf("inode = %d\t", dp2->d_ino);
24         printf("reclen = %d\t", dp2->d_reclen);
25         printf("name = %s\n", dp2->d_name);
26     }
27     closedir(dirp);
28     free(dp1);
29     free(dp2);
30     return 0;
31 }

我试过了,输出都一样的。。

时间: 2024-10-31 23:14:52

使用READDIR和多线程下的READDIR_R读取目录的相关文章

多线程下不重复读取SQL Server 表的数据

在进行一些如发送短信.邮件的业务时,我们经常会使用一个表来存储待发送的数据,由后台多个线程不断的从表中读取待发送的数据进行发送,发送完成后再将数据转移到历史表中,这样保证待发送表的数据一般情况下不会太多.如待发送表结构为: Create Table SMS(ID int not null identity(1,1),Content varchar(1024),Status int not null,CreateTime datetime); Status 取值:0未读取 1已读取 这样设计的好处

php读取目录及子目录下所有文件名的方法_php技巧

本文实例讲述了php读取目录及子目录下所有文件名的方法,分享给大家供大家参考.具体实现方法如下: 一般来说php中读取目录下的文件名的方式确实不少,最简单的是scandir,具体代码如下: 复制代码 代码如下: $dir="./caxa/"; $file=scandir($dir); print_r($file); 稍微复杂点的,来自于php手册: 复制代码 代码如下: $dir = "/etc/php5/"; // Open a known directory,

PHP读取目录下所有文件的代码_php实例

读取目录下所有文件的代码,可以不管文件名 复制代码 代码如下: <?php   $dir = "file";   // Open a known directory, and proceed to read its contents   if (is_dir($dir)) {      if ($dh = opendir($dir)) {          while (($file = readdir($dh)) !== false) {          if ($file!

如何使用线程局部存储实现多线程下的日志系统

概述 通常来说,在应用程序中需要日志来记录程序运行的状态,以便后期问题的跟踪定位.在日志系统的设计中,通常会有一个总的日志系统来统一协调这些日志的设置如位置.输出级别和内容等.在多线程编程中,当每个线程都需要输出日志时,因为要考虑线程间的同步,日志系统的设计更加复杂. 在单线程应用程序中,通常使用一个日志单例向某个文件输出应用运行过程中的重要日志信息,但是在多线程环境中,这样做显然不好,因为各个线程打印出的日志会错综复杂从而使得日志文件不容易阅读和跟踪.比较好的办法是主线程记录自己的日志,各个子

C#读取目录下所有指定类型文件的方法

  本文实例讲述了C#读取目录下所有指定类型文件的方法.分享给大家供大家参考.具体分析如下: 首先要引入命名空间:using System.IO; 再写读取方法: ? 1 2 3 4 5 6 7 8 9 10 DirectoryInfo dir = new DirectoryInfo(path); //path为某个目录,如: "D:Program Files" FileInfo[] inf = dir.GetFiles(); foreach (FileInfo finf in inf

浅析Python多线程下的变量问题

  这篇文章主要介绍了Python多线程下的变量问题,由于GIL的存在,Python的多线程编程问题一直是开发者中的热点话题,需要的朋友可以参考下 在多线程环境下,每个线程都有自己的数据.一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁. 但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 def process_student(name): std =

c++-vc2013下.bmp图片读取处理与保存

问题描述 vc2013下.bmp图片读取处理与保存 写一个C++后台程序,可以自动地对指定文件夹中的bmp图片进行处理,处理后的图片保存到另一个文件夹中,如果文件夹中无需要处理的图片,则程序处于休眠状态 如何遍历指定文件夹中的所有图片文件? 解决方案 void ProcPicDir(CString strPicDir) { CFileFind fileFinder; if (strPicDir.Right(1) == TEXT("")) { int nPos = strPicDir.R

ASP.NET多线程下使用HttpContext.Current为null解决方案

问题一:多线程下获取文件绝对路径   当我们使用HttpContext.Current.Server.MapPath(strPath)获取绝对路径时HttpContext.Current为null,解决办法如下:        ///          /// 获得当前绝对路径         ///          /// 指定的路径         /// 绝对路径         public static string GetMapPath(string strPath)       

c++-C++下如何从读取文件内的数据并且排序然后输出到另外一个文件

问题描述 C++下如何从读取文件内的数据并且排序然后输出到另外一个文件 如题 大一新手 自学太累了 希望有引路人 拜托各位了 谢谢! 解决方案 即便你学会了,写起来也要好多行,建议你用C#吧.实现整个需求只要1行代码就行了: File.WriteAllLines("输出文件.txt", File.ReadAllLines("文件名.txt").OrderBy(x => 排序条件)); 解决方案二: 自学太累?是你没有用心吧.偶也是自学走过来的,非计算机及相关专