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总结的更多相关文章

  1. 第14章——高级IO函数

    1.套接字超时 套接字IO函数设置超时的方法有三种: (1)调用alarm. (2)select (3)使用SO_RECTIMEO和 SO_SNDTIMEO 选项 上面三种方法适用于输入输出操作(re ...

  2. APUE读书笔记-第14章-高级I/O

    14.1 引言 *高级I/O包括非阻塞I/O.记录锁.系统V流机制.I/O多路转换(select和poll函数).readv和writev函数以及存储映射I/O(mmap) 14.2 非阻塞I/O * ...

  3. UNIX环境高级编程 第14章 高级I/O

    这一章涉及很多概念和函数,包括:非阻塞I/O.记录锁.I/O复用.异步I/O.readv和writev函数以及内存映射. 非阻塞I/O 在Unix中,可以将系统调用分为两种,一种是“低速”系统调用,另 ...

  4. JavaScript高级程序设计(第三版)学习笔记13、14章

    第13章,事件 事件冒泡 IE的事件叫做事件冒泡:由具体到不具体 <!DOCTYPE html> <html> <head>      <title>E ...

  5. (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. 《Unix 网络编程》14:高级 I/O 函数

    高级 I/O 函数 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

  7. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

  8. 【RL-TCPnet网络教程】第14章 RL-TCPnet之TCP客户端

    第14章      RL-TCPnet之TCP客户端 本章节为大家讲解RL-TCPnet的TCP客户端实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...

  9. Ext JS 6学习文档-第6章-高级组件

    Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件,比如 tree 和 data view.它将为读者呈现一个示例项目为 图片浏览器,它使用 tree 和 data view 组 ...

随机推荐

  1. HW1.4

    public class Solution { public static void main(String[] args) { System.out.println("a a^2 a^3& ...

  2. 1515:打印1到最大的N位数 @jobdu

    题目1515:打印1到最大的N位数 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:625 解决:323 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一 ...

  3. uedit富文本编辑器

    问题: 1: An error occurred at line: 6 in the generated java fileOnly a type can be imported. com.baidu ...

  4. ios 解决有关火星坐标的问题

    CLLocationManager 定位获取CLLocation 是地球坐标,而MKMapView 获取的是天朝火星坐标,这就导致了使用定位的时候,显示用户的蓝点和当前定位信息偏差(因为蓝点是调用了M ...

  5. linux shell突然显示-bash-4.1#的解决方法

    老沙昨天还登录这个linux服务器,并且命令行好好的,今天突然在linux shell中不显示路径了,显示为-bash-4.1#. 以下是老沙的解决方案 vim ~/.bash_profile 如果没 ...

  6. vs调试 本地IIS

    http://www.cnblogs.com/minesky/p/3389955.html 准备篇-配置IIS环境 网站发布到测试环境或者生产后,经常会出现各种让人解不开的疑问,想调试也调试不了.可以 ...

  7. Linux crontab 命令格式与具体样例

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

  8. Error: no `server' JVM at...解决办法 【转】

    出现问题:用java -jar XXX.jar -server -Xms900m -Xmx900m 提示错误Error: no `server' JVM at `C:\Program Files\Ja ...

  9. 写个 Hello World 而已,要不要这么震撼?!

    Atom 编辑器的一个插件,可以让你写代码的时候体验狂拽酷炫的效果! 如果来点音乐.再配上机械键盘的话,写代码是不是爽到爆呢? 这货全名叫: activate-power-mode atom pack ...

  10. MyEclipse的快捷键的使用

    MyEclipse的10个快捷键:Ctrl + Shift + T: 打开类型:显示"打开类型"对话框来在编辑器中打开类型."打开类型"选择对话框显示工作空间中 ...