第14章高级IO总结
1 低速系统调用
可能使进程永远阻塞的一类系统调用,包括:
1)读某些文件类型(管道、终端、网络设备)的数据
2)写某些文件类型(管道、终端、网络设备),但数据不能被立即接受(管道中无空间、流量控制等因素)
3)打开某些文件类型
4)对已经加上强制性记录锁的文件进行读、写
5)某些ioctl函数
6)某些进程间通信函数
2 记录锁
当一个进程正在读或修改文件的某一部分时,可以阻止其他进程修改同一文件区
#include <fcntl.h>
int fcntl(int filedes,int cmd,.../* struct flock *flockptr */
struct flock
{
short l_type;/* F_RDLCK,F_WRLCK,F_UNLCK */
off_t l_start;/* offset in bytes,relative to l_whence */
short l_whence;/* SEEK_SET,SEEK_CUR,SEEK_END */
off_t l_len; /* length,in bytes;0 means lock to EOF */
pid_t l_pid;/* returned with F_GETLK */
}
F_GETLK:判断flockptr是否会被其他记录锁排斥,会则将排斥该锁的锁信息填充到flockptr,不排斥则将l_type设置为F_UNLCK
F_GETFL函数并不是查询一个文件的记录锁,而是查询一个记录锁是否与其他记录锁冲突
F_SETLK:尝试建立flockptr描述的文件锁,非阻塞
F_SETLKW:建立文件锁的阻塞版本
文件的记录锁信息在文件V节点表中,通过struct flock类型链表保存
3 I/O多路转接 select
当需要从多个文件中进行读写操作时,阻塞式I/O和非阻塞式I/O各有问题
select函数在目标文件描述符集中查询是否有可读、可写的文件描述符,有则返回,无则等待(或返回,与tvptr有关)
#include <sys/select.h>
int select(int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *tvptr)
readfds、writefds、exceptfds分别表示关心的可读、可写、异常文件描述
maxfdp1表示三个文件描述符集中最大文件描述符加1
返回值:
-1:出错
0:没有文件描述符准备好
正值:已经准备好的描述符数
tvptr:
struct timeval
{
long tv_sec;
long tv_usec;
};
tvptr=NULL:无限等待
tvptr->tv_sec==0 && tvptr->tv_usec==0:查询并立即返回
tvptr->tv_sec!=0 || tvptr->tv_usec!=0 :最多等待时间
fd_set的操作:
#include <sys/select.h>
int FD_ISSET(int fd,fd_set *fdset)
void FD_CLR(int fd,fd_set *fdset)
void FD_ADD(int fd,fd_set *fdset)
void FD_ZERO(fd_set *fdset)
select函数变体pselect函数:
int pselect(int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *excepfds,const struct timespec tsptr,const sigset_t *sigmaske)
pselect函数支持函数执行时信号屏蔽字设置,同时时间采用timespec结构(秒和纳秒,比timeval更精确)
4 I/O多路转接 poll
poll函数类似于select函数但提供不同的函数接口:
int poll(struct pollfd fdarrat[],nfds_t nfds,int timeout)
struct pollfd
{
int fd;
short events;
short revents;
};
events表示在fd上关心的状态,revents返回时被填写
events和revents可取值:
POLLIN:不阻塞的可读除高优先级之外的数据
POLLRDNORM:不阻塞的可读普通数据
POLLRDBAND:不阻塞的可读非0优先级波段数据
POLLPRI:不阻塞的可读高优先级数据
POLLOUT:不阻塞的可写普通数据
POLLWRNORM:与POLLOUT相同
POLLWRBAND:不阻塞的可写非0优先级波段数据
仅revents可取值:
POLLERR:已出错
POLLHUP:已挂断
POLLNVAL:描述符不引用一打开文件
5 存储映射I/O
#include <sys/mman.h>
void *mmap(void *addr,size_t len,int prot,int flag,int filedes,off_t off)
prot:映射区权限
PROT_READ:映射区可读
PROT_WRITE:映射区可写
PROT_EXEC:映射区可执行
PROT_NONE:映射区不可访问
flag:
MAP_FIXED:返回值必须等于addr
MAP_SHARED:缓冲区操作修改映射文件
MAP_PRIVATE:缓冲区操作对应映射文件的副本
修改映射缓冲区权限:
#include <sys/mman.h>
int mprotect(void *addr,size_t len,int prot)
解除映射:
int munmap(addr_t *addr,size_t len)
第14章高级IO总结的更多相关文章
- 第14章——高级IO函数
1.套接字超时 套接字IO函数设置超时的方法有三种: (1)调用alarm. (2)select (3)使用SO_RECTIMEO和 SO_SNDTIMEO 选项 上面三种方法适用于输入输出操作(re ...
- APUE读书笔记-第14章-高级I/O
14.1 引言 *高级I/O包括非阻塞I/O.记录锁.系统V流机制.I/O多路转换(select和poll函数).readv和writev函数以及存储映射I/O(mmap) 14.2 非阻塞I/O * ...
- UNIX环境高级编程 第14章 高级I/O
这一章涉及很多概念和函数,包括:非阻塞I/O.记录锁.I/O复用.异步I/O.readv和writev函数以及内存映射. 非阻塞I/O 在Unix中,可以将系统调用分为两种,一种是“低速”系统调用,另 ...
- JavaScript高级程序设计(第三版)学习笔记13、14章
第13章,事件 事件冒泡 IE的事件叫做事件冒泡:由具体到不具体 <!DOCTYPE html> <html> <head> <title>E ...
- (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- 《Unix 网络编程》14:高级 I/O 函数
高级 I/O 函数 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
- ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述
★PART1:32位保护模式下任务的隔离和特权级保护 这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...
- 【RL-TCPnet网络教程】第14章 RL-TCPnet之TCP客户端
第14章 RL-TCPnet之TCP客户端 本章节为大家讲解RL-TCPnet的TCP客户端实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...
- Ext JS 6学习文档-第6章-高级组件
Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件,比如 tree 和 data view.它将为读者呈现一个示例项目为 图片浏览器,它使用 tree 和 data view 组 ...
随机推荐
- uva_12535 - Probability Through Experiments
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- A Tour of Go Multiple results
A function can return any number of results. This function returns two strings. package main import ...
- zookeeper-3.4.8 集群搭建
一.虚拟机环境 见我的另一篇博客http://www.cnblogs.com/xckk/p/6000881.html, zookeeper是用JAVA编写,因此需要安装JDK环境,centos下安装J ...
- Apache CXF框架结构和基本原理(转)
原文链接:http://blog.sina.com.cn/s/blog_6182547f01017pak.html CXF旨在为服务创建必要的基础设施,它的整体架构主要由以下几个部分组成: 1.Bus ...
- 【S13】vector和string优先于动态分配的内存
1.使用new动态分配内存,必须承担如下责任: a.使用delete释放内存: b.确保使用了正确的形式,delete与new的形式要匹配: c.不能重复delete. 2.使用vector和stri ...
- STM32 驱动12864液晶显示汉字、图片、画点、横线、竖线、斜线
我做本实验的软件平台为MDK软件,选用STM32VET6,12864液晶屏5v供电采用并行接法.之前本来想网上找一个现成的程序实验一下,但都没找到合适的,于是就自己编写了一个,最终可在12864液晶屏 ...
- localtunnel.me 原理流程浅析
本文採用知识共享署名-同样方式共享 4.0 国际许可协议进行许可. 近期公司的项目须要一个后台server,要求能将内网的WEBserver暴露在外网上.于是.就在网上到处搜开源项目.找到两个口碑 ...
- android优化(json工具,message新建/传递,avtivity深入学习视频)
1,在线json校验工具:www.bejson.com 2, 在handler中经常使用的 message的传递上,message.what使用静态量 . private static final i ...
- android107 指针入门
#include <stdio.h> #include <stdlib.h> //指针就是内存地址 //32为操作系统最大是4G内存,32为系统则是2的32次方, //所以只能 ...
- 进程控制之更改用户ID和组ID
在UNIX系统中,特权(例如能改变当前日期的表示法以及访问控制(例如,能否读.写一特定文件))是基于用户ID和组ID的.当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己的用户I ...