opendir是安全重入函数吗_Linux系统下读取目录操作及可重入函数介绍

-----在写文章之前,分享一下今晚看伟东山老师的直播收获心得。我自身是一个小菜鸟

,第一次听QEMU模拟器软件,不过听完老师的介绍感觉这功能好强大,感觉都不用买硬件了来做实验的(不过还是建议买开发板来做实验,比较有感觉,因为它还是不能模拟出特别先进的芯片,以及无法模拟出类似于GPU等复杂的硬件,而且搞底层软件开发的,还是要有开发板来支持的;当然,当你手头不是宽裕的时候,这个时候QEMU还是可以派上一定的作用了,至少可以测试一般的外设功能的,还是很强大的,我自己也在摸索使用),这里有兴趣的小伙伴可以看这个教程--------http://wiki.100ask.org/100ask_imx6ul_qemu。同时也非常期待伟老师后期录制的新教学视频。

一、读取目录下的子文件:

1、在Linux系统下,打开和读取目录下的子文件主要是用opendir与readdir函数来操作的,我们解析一下这两个函数的原型:

a、opendir函数:

#include 

#include 

DIR *opendir(const char *name);           //文件指针

DIR *fdopendir(int fd);

注:opendir打开一个目录后得到一个DIR类型的指针给readdir使用。

b、readdir函数:

#include 

struct dirent *readdir(DIR *dirp);                       //结构体指针,DIR *dirp是一个目录

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

注:1)readdir函数调用一次就会返回一个struct dirent类型的指针,这个指针指向一个结构体变量,这个结构体变量里面记录了一个目录项(所谓目录项就是目录中的一个子文件)。

2)readdir调用一次只能读出一个目录项,要想读出目录中所有的目录项必须多次调用readdir函数。readdir函数内部户记住哪个目录项已经被读过了哪个还没读,所以多次调用后不会重复返回已经返回过的目录项。当readdir函数返回NULL时就表示目录中所有的目录项已经读完了。

2、下面就来用代码来做一个简单的试验,我们来判断它的文件类型,是普通文件还是不是普通文件,下面是我是在 /mnt/hgfs/day

目录进行操作的,里面有8个子文件:

代码示例:

#include 

#include 

#include 

int main(int argc, char **argv){

NULL;

struct dirent * pEnt = NULL;

unsigned int cnt = 0;

if (argc != 2)

printf("usage: %s dirname\n", argv[0]);//这个argv[0]表示传进来的文件目录名

return -1;

1]);

if (NULL == pDir)

"opendir");

return -1;

while (1)

if(pEnt != NULL)

// 还有子文件,在此处理子文件

printf("name:[%s]   ,", pEnt->d_name);

if (pEnt->d_type == DT_REG)

printf("是普通文件\n");

else

printf("不是普通文件\n");

else

break;

printf("总文件数为:%d\n", cnt);

43

return 0;

演示效果:

小结:这里也可以去尝试测试一下其他一些类型文件方法是一样的。

二、可重入函数介绍:

1、在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。相反,肯定有一个安全的函数,这个安全的函数又叫可重入函数。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括 static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果确实需要访问全局变量(包括 static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。

编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。

示例:假设 Exam 是 int 型全局变量,函数 Squre_Exam 返回 Exam 平方值。那么如下函数不具有可重入性。

int Exam = 0;  //全局变量

unsigned int example( int para ){

4

unsigned int temp;

6

// (**)

8

10

return temp;

此函数若被多个进程调用的话,其结果可能是未知的,因为当(**)语句刚执行完后,另外一个使用本函数的进程可能正好被激活,那么当新激活的进程执行到此函数时,将使 Exam 赋与另一个不同的 para 值,所以当控制重新回到 “temp = Square_Exam( )” 后,计算出的temp很可能不是预想中的结果。此函数应如下改进。

int Exam = 0;

2

unsigned int example( int para ){

6

unsigned int temp;

8

//(1)  加锁

10

12

14

//     解锁

16

return temp;

18

申请不到“信号量”,说明另外的进程正处于给 Exam 赋值并计算其平方过程中(即正在使用此信号),本进程必须等待其释放信号后,才可继续执行。若申请到信号,则可继续执行,但其它进程必须等待本进程释放信号量后,才能再使用本信号。

保证函数的可重入性的方法:

1)在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量);

2)对于要使用的全局变量要加以保护(如采取关中断、信号量等互斥方法),这样构成的函数就一定是一个可重入的函数。

3)注意定义可重入函数,函数内不能含有全局变量及static变量,不能使用malloc、free

注明:上面的readdir函数和我们前面接触的一些函数是不同的,首先readdir函数直接返回了一个结构体变量指针,因为readdir内部申请了内存并且给我们返回了地址。多次调用readdir其实readir内部并不会重复申请内存而是使用第一次调用readdir时分配的那个内存。这个设计方法是readdir不可重入的关键。readdir在多次调用时是有关联的,这个关联也标明readdir函数是不可重入的。

三、总结:

明天继续分享双链表操作的文章学习,今晚听伟老师的直播课收获还真蛮大的,更加明确了自己要走的方向,在这里也非常感谢老师的分享。

---欢迎关注公众号,可以查看往期的文章:

加我个人微信,然后拉进交流群(因为之前有加入群里的经常发广告,所以只能这样,还望理解。群里只能讨论技术方面的,发广告,立刻飞机):

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里AI界的新伙伴,1秒钟自动生成20000条文案

摘要: 最近,阿里“AI家族”又多了一位新的小伙伴——“AI智能文案”,俗称文案妹。 妹妹具备一个超能力,能仅用1秒钟自动生成20000条文案。 来,大家一起感受一下: 比如说你想买瓶粉底液,根据功效…

华为 招聘 状态 查看_英特尔放弃5G芯片研发:三星受益;爱立信2019年Q1净利润约2.51亿美元;华为也将要与高通和解;天津首个5G电话成功打通...

点击上方“通信人才网” 订阅!导读:今日热点 爱立信2019年Q1净利润约2.51亿美元 扭亏为盈近日,爱立信发布截至2019年3月31日的第一季度财报。财报显示:爱立信第一季度净营收为489.06亿瑞典克朗(约合52.93亿美元),较去年…

异步消息队列中间件

安装: rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpmrpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpmrpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm配置文件: vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app找到loopback_users,把双引…

创纪录!浪潮云海完成OpenStack Rocky版本全球最大规模单一集群测试!

戳蓝字“CSDN云计算”关注我们哦!云计算的概念已悄然走过十余年,在助力新兴技术发展的同时,自身也在历经变革。开源作为推动云计算发展的强大动力,于云计算而言,不仅是技术变革的历史潮流,也是相互助推的最…

idea如何反编译字节码指令_美团点评:Java字节码增强技术,线上问题诊断利器...

作者简介:泽恩,美团到店住宿业务研发团队工程师。文章转载于公众号:美团技术团队1. 字节码1.1 什么是字节码?Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制&#xf…

使用机器学习预测电子竞技游戏《守望先锋》的胜负

摘要: 机器学习可以预测游戏的输赢?来看看Bowen Yang博士是如何构建这一模型的。《守望先锋》中的英雄来自加州大学河滨分校的物理学博士学位的Bowen Yang正在致力于构建一个模型——对游戏中的人物特征进行有意义的学习,来预测电子竞技游戏中…

路由器上的usb接口有什么用_工业主板上有多少种USB接口,红色的USB接口代表什么...

USB接口正式出现是在1996年,一经问世,就成功取代了串口和并口,当然这只是相对于商业电脑和民用电脑而言的,在工控机中还是有串口和并口存在的。USB版本发展至今也已经历好几个阶段,例如USB1.0、USB1.1、USB2.0、USB3.0…

植物大战僵尸不能保存进度

删除下面的所有文件,重新进入游戏即可 C:\ProgramData\PopCap Games\PlantsVsZombies\userdata

Why Redis 4.0?

摘要: 社区最新GA版本Redis 4.0推出已近一年,阿里云数据库Redis 4.0版也上线近半年,之前关于Redis 4.0的系列文章从源码实现来分析这些新功能,本文旨在从用户角度出发,让Redis的用户能够快速了解并使用Redis 4.0带来的…

GitHub 热榜第一!这个 Python 项目超 8.4k 标星,网友:太实用!

这个十一,又经历了一波抢票大战。常规办法根本抢不到,大家就把目光转移到“技术手段”上,顺便把一个Python抢票工具,送到了GitHub趋势榜第一:标星超过8.4k,来自名叫文贤平的程序员。这很可能是全GitHub最德…

c语言点按钮弹窗口,【iOS】按钮点击弹窗

拖入一个Round Rect Button,并将Button的文字修改成“点击弹窗”将ViewController.h修改为如下代码,实则在ViewController.h中添加了一行-(IBAction)messageBoxShow;,注册messageBoxShow这个函数。类似于C语言使用函数之前需要在头文件声明这…

cstring 不明确_股价不可预测明确时间点的涨跌

前言最近不少朋友或私信问或群里问几类问题:XXX 股票还能买吗?买了会不会还继续下跌?买了我能不能立刻就涨?XXX 股票能卖吗?我卖了不会还继续涨吧?XXX 股票为什么下跌这么厉害,是要有黑天鹅出现…

-bash: wget: 未找到命令

[rootlocalhost ~]# yum -y install wget

11月4日,上海开源基础设施峰会,不见不散!

戳蓝字“CSDN云计算”关注我们哦!即日起,登录上海开源基础设施峰会网站,凭“OpenInfra10”优惠码注册就能享受九折优惠。另外,OpenStack基金会还特别为CSDN云计算社区的成员们预留了宝贵位置。11月4日至6日,世界各地的…

5求的值c语言编辑,C语言中怎样求1+3+5~~~~~+9值并 – 手机爱问

2018-04-06C 语言中的原码怎么?数计算机二进制形式表示数分有符号数和无符号数原码、反码、补码都有符号定点数表示方法有符号定点数高位符号位0正1副下都8位整数例原码数本身二进制形式例1000001 -10000001 1正数反码和补码都和原码相同负数反码其原码除符号位之外…

一个学渣的阿里之路

摘要: 前言 最近有些朋友在面试阿里,加上 Java-Interview 项目的原因也有小伙伴和我讨论,近期也在负责部门的招聘,这让我想起年初那段长达三个月的奇葩面试经历

RabbitMQ 下载、安装、配置、验证_rpm版本(Linux环境)

文章目录一、RabbitMQ 安装准备二、RabbitMQ 安装2.1. 环境安装(最小化版本先安装环境)2.2. 安装包下载2.3. rpm安装RabbitMQ2.4. 配置文件修改2.5. 启动RabbitMQ2.6. 查看RabbitMQ是否启动2.7. 查看RabbitMQ 插件列表2.8. 安装RabbitMQ 管控台2.9. 浏览器访问RabbitMQ 管控台三…

python 华泰证券 客户端_华泰证券网上交易系统(高级版)下载 v8.13官方版下载

华泰证券网上交易系统高级版是止录最新的证券交易软件,该版本在原有版本上重新设计改版!数据更清晰,交易更快捷!新版本分别有行情、选股、资讯、数据和交易五大模块,新版的框架支持了4K高清显示器显示,如果…

php7.0康乐安装_Ubuntu安装php7.0环境

1.下载必须组件sudo apt-get install libxml2-devsudo apt-get install curl参考文献:http://php.net/manual/zh/install.unix.nginx.phpphp下载地址:http://php.net/releases/wget http://am1.php.net/distributions/php-7.0.0.tar.gz2.开始配置安装cd …

使用拓扑数据分析理解卷积神经网络模型的工作过程

摘要: 神经网络功能强大,但内部复杂且不透明,被称为黑匣子工具。使用拓扑数据分析以紧凑且可理解的方式描述卷积神经网络的功能和学习过程。1.简介神经网络在各种数据方面处理上已经取得了很大的成功,包括图像、文本、时间序列等。…