[读书笔记] APUE | 第十四章 | 高级IO

本文深入讲解Linux下非阻塞IO、记录锁、多路转接IO及存储映射IO的概念与实现方式。非阻塞IO允许文件描述符不被阻塞;记录锁防止多个进程同时修改同一文件区;多路转接IO如select和poll用于监测多个描述符的状态变化;存储映射IO则实现了磁盘文件与内存缓冲区的直接映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 非阻塞IO

对于一个给定的文件描述符,有两种方法对其指定非阻塞IO:

  • 如果调用open获得描述符,则可指定O_NONBLOCK标志
  • 如果对于一个已经打开的描述符,则可调用fcntl,由这个函数打开O_NONBLOCK文件状态标志。

2. 记录锁

记录锁的功能是:当一个进程读或者修改某一文件某个部分时,可以阻止其他进程修改同一文件区。
fcntl函数的第三个参数是一个指向flock结构体的指针,通过它可以指定锁的类型。

3. 多路转接IO

先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行IO时,该函数才返回。在返回时,告诉进程哪些描述符已准备好可以进行IO。
select
传向select的参数告诉内核:

  • 我们所关心的描述符
  • 每个描述符我们所关心的状态
  • 愿意等待的事件
    从select返回时,内核告诉我们:
  • 已准备好的描述符数量
  • 对于读、写、异常状态,哪些描述符就绪
    select底层是用位图来记录事件的:
    在这里插入图片描述
    poll
    与select不同,poll不是为每个状态构造一个描述集,而是构造了一个pollfd结构数组,每个数组元素指定一个描述符编号以及对其关心的状态。

4. 存储映射IO

使一个磁盘文件与存储空间中的一个缓冲区相映射,于是从缓冲区读数据就相当于读文件的相应字。
将一个指定的文件映射到指定的存储区域,用mmap函数:

  #include <sys/mman.h>

  void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值