Linux的IO易错点总结

本文主要记录IO的一些易错操作。
阻塞IO和非阻塞IO,一般都是针对数据读取的,因为write是主动行为,不存在阻塞这一说。

非阻塞式IO,一般都要配合while轮询来读取数据。

IO多路复用

当只检测一路IO的时候,和普通IO的作用差不多,只不过,多路复用可以选择阻塞、不阻塞或者超时机制。相对普通的IO操作,最大的不同就是多个超时机制。

参考:Linux驱动之poll机制的理解与简单使用 - andy_fly - 博客园 (cnblogs.com)

当然,IO多路复用主要是在一个进程或者一个线程中读取多路IO数据的场景下使用的。

只有一路的话,read阻塞读取就挺好。

当然,如果想要超时机制,可用poll函数来实现。

异步IO

其实,不管是阻塞IO还是非阻塞IO,最终都需要挂起任务或者占用CPU,此时,任务都不能干别的活。

所以,就肯定需要异步IO的机制。

在 I/O 多路复用中,进程通过系统调用 select()或 poll()来主动查询文件描述符上是否可以执行 I/O 操作,仍然是个主动的过程。而在异步 I/O 中,当文件描述符上可以执行 I/O 操作时,进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它的任务直到文件描述符可以执行 I/O 操作为止,此时内核会发送信号给进程。所以要使用异步 I/O,还得结合所学习的信号相关的内容,所以异步 I/O 通常也称为信号驱动 I/O。
要使用异步 I/O,程序需要按照如下步骤来执行:
⚫ 通过指定 O_NONBLOCK 标志使能非阻塞 I/O。
⚫ 通过指定 O_ASYNC 标志使能异步 I/O。需要注意的是:在调用 open()时无法通过指定 O_ASYNC 标志来使能异步 I/O,但可以使用 fcntl()函数添加 O_ASYNC 标志使能异步 I/O。
⚫ 设置异步 I/O 事件的接收进程。也就是当文件描述符上可执行 I/O 操作时会发送信号通知该进程,通常将调用进程设置为异步 I/O 事件的接收进程。
⚫ 为内核发送的通知信号注册一个信号处理函数。默认情况下,异步 I/O 的通知信号是 SIGIO,所以内核会给进程发送信号 SIGIO。
⚫ 以上步骤完成之后,进程就可以执行其它任务了,当 I/O 操作就绪时,内核会向进程发送一个 SIGIO
信号,当进程接收到信号时,会执行预先注册好的信号处理函数,我们就可以在信号处理函数中进行 I/O 操作。

相关推荐
今天也想MK代码6 分钟前
数据模型与持久化存储
linux·运维·ubuntu
哇哈哈&8 分钟前
awk与sed的基本使用
linux·运维·服务器
水天需01014 分钟前
Vim 搜索和替换详解
linux
乔碧萝成都分萝14 分钟前
十六、一个基本的GPIO驱动程序
linux·驱动开发·嵌入式
ModestCoder_15 分钟前
Ubuntu 22.04,Isaac Sim 5.1.0 + Isaac Lab 2.3.0 Conda 环境安装指南
linux·ubuntu·conda
水天需01023 分钟前
Vim 学习全面指南
linux
9ilk40 分钟前
【Linux】--- 多路转接select / poll / epoll
linux·运维·网络
赖small强42 分钟前
【Linux驱动开发】Linux 中断机制深度解析:原理、监控与实战
linux·中断·硬件中断
buyutang_1 小时前
Linux 网络编程:TCP协议Socket开发全流程,理解多线程多进程实现的多连接网络通讯模型
linux·网络·tcp/ip
小猫挖掘机(绝版)1 小时前
在Ubuntu 20.04 部署DiffPhysDrone并在Airsim仿真完整流程
linux·ubuntu·自动驾驶·无人机·端到端