当前位置: 首页 > article >正文

Linux 信号驱动IO

Linux 信号驱动IO

1. fcntl()

在Linux操作系统中,fcntl() 是一个用于操作文件描述符的系统调用。它提供了多种功能,包括控制文件描述符的属性、管理文件锁定、设置文件的非阻塞模式等。

本文只截取了用于IO模型的 fcntl() 部分内容, fcntl() 的详细内容请看—>Linux fcntl函数

在打开文件时,如果不使用fcntl()对其进行设置,这个文件就默认使用阻塞IO。非阻塞IO和信号驱动IO都需要手动调用fcntl()才能使用。

#include <unistd.h>

#include <fcntl.h>

int fcntl(int fd, int cmd, .../* arg */)

**fd:**需要进行操作的文件描述符。

**cmd:**指定要进行的操作。

  1. F_GETFL 表示返回当前文件描述符的状态标志,如是否是非阻塞模式(O_NONBLOCK)。
  2. F_SETFL 表示设置文件描述符的状态标志,在可变参数(arg)中,输入要设置的状态标志,如 O_NONBLOCK(非阻塞模式)、 O_ASYNC (信号驱动模式)
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);  // 设置非阻塞模式
//或
fcntl(fd, F_SETFL, flags | O_ASYNC); //设置信号驱动模式

2 信号驱动IO

信号驱动IO的原理是,当底层数据就绪时,向进程发送 SIGIO 信号,通知进程调用 recv() 读取数据。由于信号驱动 IO 也参与了 IO 的过程,所以信号驱动 IO 也属于同步 IO。

使用信号驱动 IO 首先要进行设置:

  1. signal()sigaction() 添加 SIGIO 信号及其自定义处理函数 sig_handler()

  2. fcntl() 设置 FASYNC 标志,将文件描述符设置为信号驱动模式。

    fcntl() 会调用 fasync_helper()指向该进程的指针加入到设备的异步通知队列中,表示该进程对设备的事件感兴趣。当事件发生时,比如设备驱动接收到数据, kill_fasync() 会遍历这个异步通知队列中,找到相应的进程发送 SIGIO 信号。

SignalIO1

SignalIO2


http://www.kler.cn/a/525075.html

相关文章:

  • 全程Kali linux---CTFshow misc入门(14-24)
  • 爬虫基础(一)HTTP协议 :请求与响应
  • 2025美赛数学建模MCM/ICM选题建议与分析,思路+模型+代码
  • Spring MVC 综合案例
  • ZZNUOJ(C/C++)基础练习1011——1020(详解版)
  • 54.数字翻译成字符串的可能性|Marscode AI刷题
  • 基于Springboot的健身房管理系统【附源码】
  • es6中关于let的使用以及案例,包括但不限于块级作用域,不允许重复声明,没有变量提升,暂存性死区,不与顶层对象挂钩
  • [SUCTF 2018]MultiSQL1
  • 微博热搜时光机逆向(js逆向)
  • 【力扣系列题目】最后一块石头的重量 分割回文串 验证回文串 等差数列划分{最大堆 背包 动态规划}
  • SSM总结
  • SpringBoot项目创建
  • 10.6.4 Json文件操作
  • RocketMQ原理—4.消息读写的性能优化
  • 高速PCB设计指南2——PCB设计的信号完整性
  • 【深度学习】softmax回归
  • Java—工具类类使用
  • 为什么机器学习中梯度下降是减去斜率,而不是按照其数学意义减去斜率的倒数
  • Java教程练习:学生信息管理系统
  • [STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器
  • 【AutoSar】汽车诊断标准协议UDS详解
  • 常见的同态加密算法收集
  • 【最后203篇系列】007 使用APS搭建本地定时任务
  • 1.27补题 回训练营
  • ODP(OBProxy)路由初探