高级 io

高级io:io的特殊表现有非阻塞io,文件锁,io多路转接,存储映射等

非阻塞io:在原来的io操作中,默认是阻塞io,即当读空文件时,read阻塞,在read阻塞期间,如果被信号打断了,errno会设置为EINTR,这种错误也叫假错;写满文件时,write阻塞,这种现象就是io阻塞。

阻塞io:read读空管道不会阻塞,会返回错误值-1,errno会设置为EAGAIN,这种错误称为假错;write读满管道时不会阻塞,会返回错误值。

如何将文件设置为非阻塞:

未打开的文件,open时加上选项O_NONBLOCK;

打开的文件,使用fctnl将文件设置为非阻塞;

old_f = fcntl(fd, F_GETFL);

fcntl(fd, F_SETFL, old_f | O_NONBLOCK);

捕获异步时间的两种方法:

轮询:暂且轮询。

通知:(监听文件是否可读可写的机制)-->io多路转接

有限状态机:将要处理的时间抽象出有限状态,找到状态之间的切换关系。

优点:程序更加健壮,如果有功能增加,无非就是增加几个状态,原来的状态是不需要改变的,改变的是多了几条切换的语句,本质上就是多了几个case。

select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeout)

监听rfds,wfds,efds是否发生了ready事件。

ready

rfds集中的文件空间有数据可读

wfds集中有空间可写

efds集中有异常发生了

nfds是三个集合中最大的文件描述符+1;

timeout如果是NULL,永久阻塞到ready,不是NULL,代表最大超时时间。

返回值

变成ready的文件描述符的个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值