day08
来源:互联网 发布:联合智业怎么样知乎 编辑:程序博客网 时间:2024/05/16 05:56
- 文件的管理
- 1 使用fcntl函数实现建议文件锁的功能
- 1建议锁文件锁的由来
- 2使用F_SETLK作为函数实参的用法
- 3使用F_SETLKW作为fcntl函数实参时的用法
- 4使用F_GETLK作为fcntl函数实参时的用法
- 2 access函数
- 1 使用fcntl函数实现建议文件锁的功能
- 文件的管理
1.文件的管理
1.1 使用fcntl函数实现建议/文件锁的功能
(1)建议锁/文件锁的由来
- 当两个进程在同一个时刻向同一个文件中写入数据时,可能造成数据的交错和不一致问题;
- 当一个进程在向文件中写入数据的同时,另外一个进程读取文件数据时可能造成数据的不一致问题;
- 当两个进程同时读取同一个文件数据时,可以同时进行;
- 为了实现上述表格的效果,linux系统中引入里文件锁的机制,文件锁本质上就是读写锁,一把读锁和一把写锁,其中读锁是一把共享锁,
- 允许其他进程加读锁,但不能加写锁;写锁是一把排他锁,不允许其他进程加读锁/写锁;
(2)使用F_SETLK作为函数实参的用法
- 当锁的类型是:F_RDLCK/F_WRLCK时,实现加锁效果
- 当锁的类型是:F_UNLCK时,实现解锁效果;
- 具体的锁信息由该函数的第三个参数来指定;
- 当文件上已经拥有冲突锁时,该函数调用失败,返回-1并设置errno的数值;
- 由程序结果(01lock.c和02test.c执行结果)可知:
当文件被放置文件锁之后,数据还是可以写入文件中,也就是说文件锁并不能控制其他进程的读写操作,但是文件锁可以控制其他进程是否被加锁成功(两个读锁除外)
思考:
如何实现文件锁对其他进程读写操作的控制呢?
解决方案:
一般来说,每次进行读写操作之前可以先尝试加读写锁,如果读写锁能加上,则进行读写操作,如果读写锁不能加上,则放弃读写操作,从而实现上述效果;
释放锁的主要方式:
- a.将锁的类型设置为,F_UNLCK,使用fcntl函数调用即可
- b.使用close函数关闭文件描述符时,与该描述符有关的文件锁自动释放;
(3)使用F_SETLKW作为fcntl函数实参时的用法
功能和F_SETLK类似,所不同的是当文件上已经拥有冲突的锁的信息时,该函数调用并不会返回失败,而是一直等待直到文件上存在的锁被释放里为止;
(4)使用F_GETLK作为fcntl函数实参时的用法
- 调用fcntl函数的第三个实参是描述要放置在文件上的锁信息,如果该锁能够被放置在文件上,则不会真正的放置,只是将锁的类型改为F_UNLCK,结构体的其他
成员保持不变;- 如果该锁不能放置在文件上,则fcntl函数会用文件上已经存在的锁信息去替换第三个参数描述的锁信息,并将l_Pid的数值设置为真正给文件加锁进程的进程号;
注意:
一般来说,为了避免和其他进程同时进行读写操作,在每次进行读写操作之前尝试加读写锁,如果成功放置读写锁时,则进行读写操作,在执行完毕读写操作之后,再释放读写锁;如果不能成功放置读写锁,则放弃读写操作。
1.2 access函数
#include <unistd.h>int access(const char *pathname, int mode);第一个参数:字符串形式的文件路径名;第二个参数:具体的操作模式; F_OK - 判断文件释放存在; R_ok - 判断文件是否可读; W_OK - 判断文件是否可写; X_OK - 判断文件释放可执行;函数功能: 主要用于检查文件的存在性以及是否拥有对应的权限;注意:chmod命令 为加权限命令 如:chmod a+x a.txt是给a.txt加可执行权限;嵌入式
练习:
查询和尝试使用stat函数
明日预报:
(1)文件管理
(2)目录管理
(3)进程管理
阅读全文
0 0
- day08
- day08
- day08
- day08
- day08
- day08
- day08
- day08
- day08
- day08
- day08
- day08
- day08
- Day08
- day08
- day08
- day08 homework
- 作业day08
- Hibernate的工具类HibernateUtils.java中创建sessionFactory的相关问题
- ContentProvider Hook解析
- jmeter 报告优化
- UPC 2017 Summer Training 1
- AJAX-简单示例
- day08
- 8月2日训练
- 组件化架构漫谈
- 机器学习教程之13-决策树(decision tree)的sklearn实现
- 丑陋的字符串2
- Lucene&&Solr中的域(Filed)总结
- TabLayout、ViewPager和Fragment之间的通讯
- [LeetCode]104. Maximum Depth of Binary Tree--二叉树的最大深度
- 微信小程序之一本地图片处理--按屏幕尺寸插入图片