Linux基础------高级IO

实际上 IO = “等” + 拷贝
等什么呢? -----> 等待的是内核将数据准备好。
拷贝-------> 数据从内核考到用户

IO话题: 无非就是 1 , 改变等的方式 2 , 减少等的比重。

阻塞IO

当内核没有将数据准备好的时候, 系统调用会一直阻塞。 (所有的套接字, 默认都是阻塞)
在这里插入图片描述

非阻塞IO

非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK错误码,
非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询, 对CPU来说是低效的。

并且,在非阻塞的情况下, 出错 和 数据未就绪都是以 返回错误的形式。
那如何区分 真正的错误 和 未就绪的情况的呢? ———> 数据未就绪的情况 ----errno ——–> EAGAIN ==11
在这里插入图片描述

一个文件描述符fd默认是阻塞IO,如何设置未非阻塞呢?
在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
using namespace std;


 void SetNoBlock(int fd) 
 {
	 int fl = fcntl(fd, F_GETFL);  //获得这个文件描述符相关属性f1
	 if (fl < 0) 
	 {
		 perror("fcntl");
		 return;
		
	 }
	 fcntl(fd, F_SETFL, fl | O_NONBLOCK); //将非阻塞设置进该文件描述符fd
	
}

 int main() 
 {
	SetNoBlock(0);
	 while (1) 
	 {
		 char buf[1024] = { 0 };
		 ssize_t read_size = read(0, buf, sizeof(buf) - 1);
		 if (read_size < 0) 
		 {
			 cout << "未读到内容" << endl;
			 sleep(2);
			 continue;
			
		 }
		cout << "读到的内容为 : "  << buf << endl;
		
	}
	 return 0;	
}

运行结果:
在这里插入图片描述

信号驱动

内核将数据准备好以后,通过信号SIGIO信号去通知应用进程。
然后应用进程去调用接口去IO。

在这里插入图片描述

异步IO

当应用进程IO的时候, 内核完成了 等 + 拷贝 之后通知应用进程。

在这里插入图片描述

信号驱动和异步IO的区别:
内核在数据拷贝完成时, 通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据),
也就是说信号驱动是告诉进程什么时候可以进行IO, 而异步IO是告诉进程什么时候IO(等 + 拷贝都)完成了。

同步通信和异步通信:
同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回. 但是一旦调用返回,就得到返回值了
异步相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果;
当一个异步过程调用发出后,调用者不会立刻得到结果; 而是在调用发出后,被调用者通过状态、通知来通知调用
者,或通过回调函数处理这个调用.

多路转接(核心终点)

可以同时等待多个文件描述符。
在后面的博客分别详细解释select, poll, epoll。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通过全部用例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值