C++ readdir、readdir_r函数
readdir, readdir_r - 读一个目录
readdir函数:
struct dirent *readdir(DIR *dirp);
The data returned by readdir() may be overwritten by subsequent calls to readdir() for the same directory stream.
成功时,readdir() 返回指向 dirent 结构的指针。(这个结构是静态分配的;不要试图去free(3) 它。)如果到达了上当结尾,NULL 被返回并保持ERRNO不变。如果错误发生了,NULL 被返回并小心设置 ERRNO值。
readdir函数为非线程安全函数;
解决方法:
1、加锁;
2、用局部变量保存数据。
readdir_r()就是采用局部变量保存数据;
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
The readdir_r() function returns 0 on success. On error, it returns apositive error number (listed under ERRORS). If the end of the directory stream is reached, readdir_r() returns 0, and returns NULL in*result.
readdir_r() 函数是 readdir() 函数可重入版本。它从目录流dirp 里读取下一个目录项,并且通过调用者分配的缓存区 entry返回。返回条目的指针被放置于 *result 里;如果目录流到达结尾,那么把*result 设置为 NULL。
#include <iostream>
#include <dirent.h>
using namespace std;
int main()
{
struct dirent *pStResult = NULL;
struct dirent *pStEntry = NULL;
int len = 0; DIR *pDir = opendir("/home/wzy/owner_lib");
if(NULL == pDir)
{
printf("Opendir failed!\n");
return 0;
} len = offsetof(struct dirent, d_name) + pathconf("/home/wzy/owner_lib", _PC_NAME_MAX) + 1;
pStEntry = (struct dirent*)malloc(len);
while(! readdir_r(pDir, pStEntry, &pStResult) && pStResult != NULL)
{
printf("file'name is %s\n", pStEntry->d_name);
} free(pStEntry);
closedir(pDir);
return 0;
}
C++ readdir、readdir_r函数的更多相关文章
- Linux c readdir是非线程安全,需用readdir_r,要注意用静态变量当做返回值的函数的非线程安全性
readdir函数: struct dirent *readdir(DIR *dirp); The data returned by readdir() may be overwritten by ...
- 是readdir,还是readdir_r
readdir的原型如下: struct dirent *readdir(DIR *dirp); 因为内部使用了静态数据,所以readdir被认为不是线程安全的函数,POSIX[i]标准这样描述: T ...
- PHP之readdir()函数
最近在学习php文件操作的相关知识,记录一下readdir()函数其中的一个要注意的点 1. 在$temp=readdir($handle)函数中 readdir获取的是文件名和$handle中的文件 ...
- Linux 目录流管理
目录 1. 打开/关闭文件 1). 打开目录 / opendir 2). 关闭文件 / fclose 2. 读/写目录流 1). 目录流-读 / readdir & readdir_r 3. ...
- [译] man 7 pthreads
NAME pthreads - POSIX threads DESCRIPTION POSIX.1 指定了一组叫做POSIX线程或Pthreads的编程接口(函数,头文件).单 ...
- POSIX多线程—概述
作者:阿波链接:http://blog.csdn.net/livelylittlefish/article/details/7918110 (整半年没有更新,发几篇以前的读书笔记.) Content ...
- POSIX多线程
全文共分四部分: POSIX多线程—概述 POSIX多线程—异步编程举例 POSIX多线程—线程基本概念 POSIX多线程—互斥量概述 POSIX多线程—概述 Content 1. ...
- 在Linux下和Windows下遍历目录的方法及如何达成一致性操作
最近因为测试目的需要遍历一个目录下面的所有文件进行操作,主要是读每个文件的内容,只要知道文件名就OK了.在Java中直接用File类就可以搞定,因为Java中使用了组合模式,使得客户端对单个文件和文件 ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- PAT 1128 N Queens Puzzle[对角线判断]
1128 N Queens Puzzle(20 分) The "eight queens puzzle" is the problem of placing eight chess ...
- Selenium IDE脚本录制步骤简介
录制脚本步骤: 1.打开Selenium IDE,输入需要录制脚本的地址,然后启动Firefox,输入selenium IDE需录制的地址,根据实际需求,做相关操作: 2.录制过程中,会发现做的相关操 ...
- [LeetCode] 82. Remove Duplicates from Sorted List II_Medium tag: Linked List
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinctnumbe ...
- 史上最全的MonkeyRunner自动化测试从入门到精通(2)
原文地址https://blog.csdn.net/liu_jing_hui/article/details/60955696 最基本脚本功能开始编写 (1)Monkeyrunner和Monkey的区 ...
- SLG手游Java服务器的设计与开发——数据管理
文章版权归腾讯GAD所有,禁止匿名转载:禁止商业使用:禁止个人使用. 一.前言 上文介绍了我们的SLG手游的服务器架构设计以及网络通信部分,本文介绍数据管理部分,在数据存储方面,我选择了Mysql.M ...
- Java基础教程:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- 【深入理解JVM】:类加载器与双亲委派模型
类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...
- bzoj1621 / P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm
P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm 基础dfs,按题意递归即可. #include<iostream> #include< ...
- sqlite中的时间
插入时间的sql语句 ','-61') 时间格式'2014-11-17T19:37:32' 年月日和时分秒之间多了一个字母T,保存到数据库的时候,会自动给时间加8个小时. 保存的结果为2014-11- ...
- 使用 v-cloak 防止页面加载时出现 vue.js 的变量名
知识点:使用 v-cloak 防止页面加载时出现 vue.js 的变量名 场景:在使用vue语法,实现下拉框功能时,展示数据列表之前,出现对应的 vuejs 变量名 代码: var vm = new ...