4.文件IO-阻塞与非阻塞IO

阻塞IO

通常来说,从普通文件读数据,无论你是采用 fscanf,fgets 也好,read 也好,一定会在有限的时间内返回;

但是如果你从设备,比如终端(标准输入设备)读数据,只要没有遇到换行符('\n'),read 一定会“堵”在那而不返回;

还有比如从网络读数据,如果网络一直没有数据到来,read 函数也会一直堵在那而不返回;

read的这种行为,称之为block,一旦发生block,本进程将会被操作系统设置为睡眠,直到等待的事件发生(比如有数据到来),进程才会被唤醒;

系统调用 write 同样有可能被阻塞,比如向网络写入数据,如果对方一直不接收,本端的缓冲区一旦被写满,就会被阻塞;

非阻塞IO

即不管有没有数据到来,只要函数执行完毕,就结束;

注意点

阻塞非阻塞是文件本身的特性,不是系统调用read/write本身可以控制的;

终端默认是阻塞的,我们可以重新 open 设备文件 /dev/tty(表示当前终端),打开的时候指定 O_NONBLOCK 标志就行了;

非阻塞 read,如果有数据到到来,返回读取到的数据的字节数;如果没有数据到来,返回 -1,这时候我们没有办法判断到底是因为出错而返回,还是因为没有数据返回;所以需要借助 errno 全局变量,来判断是什么原因。如果 errno 的值为 E_WOULDBLOCK或 E_AGAIN(这两个宏的值是一样的),表示当前没有数据到达,希望你再尝试一次。因为 read 返回 -1 前,linux 系统会在 read 返回前给 errno 赋值,来告诉应用层,到底是什么原因;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值