UNIX高级编程-高级I/O
来源:互联网 发布:java软件工程师就业班 编辑:程序博客网 时间:2024/05/22 23:59
第14章高级I/O
14.1 非阻塞I/O
高级I/O:非阻塞I/O、记录锁、系统V流机制、I/O多路转接、readv和writev函数以及存储映射I/O
低速系统调用可能会永远阻塞进程:
1) 某些文件(管道、终端设备、网络设备)的数据不存在,读操作会导致调用者永远阻塞
2) 数据不能立即被上述同样类型的文件接受,写操作会导致调用者永远阻塞
3) 在某种条件发生之前,打开某些类型的文件会被阻塞
4) 对已经加上强制性记录锁的文件进行读写
5) 某些ioctl操作
6) 某些进程间通信函数
对于给定的文件描述符有两种方法对其指定非阻塞I/O
1) 调用open获得文件描述符,指定O_NONBLOCK标志
2) 对于已经打开的文件描述符,调用fcntl,打开O_NONBLOCK文件状态标志
14.2 记录锁
功能:当某个进程正在读/写文件的某部分时,可以阻止其他进程修改同一文件区。
Int fcntl(int filedes.,int cmd,/*structflock *flockptr */);
Cmd:F_GETLK、F_SETLK、F_SETLKW
Struct flock{
Short l_type; //共享读锁,独占性写锁,解锁
Off_t l_start; //加锁或者解锁文件区域的其实字节偏移量
Short l_whence;//SEEK_SET,SEEK_CUR,orSEEK_END
Off_t l_len; //文件区域的字节长度
Pid_t l_pid;//能阻塞当前进程的锁的进程号,返回F_GETLK
}
F_GETLK:判断flockptr所描述的锁是否被另一把锁排斥
F_SETLK:设置flockptr所描述的锁
F_SETLKW:F_SETLK的阻塞版本
通过将l_start设置为0,whence设置为SEEK_SET可以锁住整个文件,多个进程访问同一个文件时,新锁会替换旧锁,当加读锁时,文件描述符必须为读打开,当加写锁时,文件描述符必须写打开
死锁产生的情况:当两个进程相互等待对方持有并锁定的资源时
锁的隐含继承与释放:
1) 进程终止,则它所建立的全部锁会释放;当关闭任意文件描述符,其引用的文件上的全部锁释放
2) Fork产生的子进程不继承父进程设置的锁
3) 执行exec后,新程序可以继承原执行程序的锁。
建议性锁和强制性锁
强制性锁会对每个read,write,open系统调用都会进行检查,检查调用进程对访问的文件是否违背了某一把锁的作用
- UNIX高级编程-高级I/O
- UNIX高级编程-高级I/O
- UNIX环境高级编程----文件I/O
- UNIX环境高级编程----标准I/O
- 《unix高级环境编程》文件I/O
- 《unix高级环境编程》文件I/O
- unix编程(八)高级I/O
- Unix环境高级编程---文件I/O
- UNIX环境高级编程--标准I/O
- Unix高级编程-文件I/O
- UNIX高级编程-标准I/O
- UNIX环境高级编程--高级I/O(三)
- UNIX环境高级编程第十四章 高级I/O 总结
- 《UNIX环境高级编程》十四高级I/O读书笔记
- UNIX环境高级编程笔记之高级I/O
- UNIX的高级I/O
- unix 高级I/O详解
- Linux/UNIX高级I/O
- LeetCode 24. Swap Nodes in Pairs
- JAVA--HashCode 基础(判断对象是否相等)
- Ural 2069 Hard Rock
- Android TextSwitcher 文本切换器
- Qt使用QStackedWidget实现堆栈窗口
- UNIX高级编程-高级I/O
- 主分区 逻辑分区
- [数据表设计] - 商品模型数据架构图
- Java集合框架总结
- [yii2] -- [ActiveForm] -- ActiveForm的使用方法
- 可变参数
- Recovery 下mi debug方法
- Java8 移除了APT以及mirror API后,使用Pluggable Annotation Processing API
- 样式优先级CSS优先级CSS样式权重