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 操作。

相关推荐
新时代牛马31 分钟前
Linux 内核入门地图:架构、源码目录与五大子系统
linux·运维·架构
Julien20041 小时前
控制 SELinux 文件上下文
linux·运维·服务器
sulikey1 小时前
Linux Core Dump 完全指南:从原理到实战的崩溃调试手册。什么是core dump?程序报错core dumped怎么办?
linux·服务器·操作系统·调试·coredump
MayZork4 小时前
Windows 与 Linux 下 vcpkg 的安装部署指南
linux·运维·windows
zbyyd4 小时前
Linux 进程间通信学习笔记
linux·笔记·学习
w200512248 小时前
Pod管理
linux·服务器·云原生·容器·k8s·podman
chen<>9 小时前
C++ 六种 memory_order:从原子性到线程间可见性.md
java·linux·开发语言·c++
一直C9 小时前
Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)
linux·c语言·开发语言·网络·青少年编程·visual studio code
库玛西9 小时前
Linux网络编程:HTTP/HTTPS协议核心技术全解析
linux·运维·服务器·网络·c++·http·https
sxd20019 小时前
Vmware和multicast
linux·windows·vmware·无线桥接·multicast