APUE阅读笔记(chapter 14)——高级I/O

本篇博客详细介绍了高级I/O技术,包括非阻塞I/O、文件记录锁、STREAMS、I/O多路转接、writev/readv、writen/readn以及存储映射。详细阐述了非阻塞I/O的实现方式,文件记录锁的功能及使用,STREAMS的传输机制,I/O多路转换的优化方法,以及writev/readv、writen/readn和存储映射的原理和应用。

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

        本章主要介绍一些高级I/O,包括非阻塞I/O、文件记录锁、STREAMS、I/O多路转接、writev/readv、writen/readn以及存储映射。

1、非阻塞I/O:

  • 对于write函数调用,在有些情况下(如数据不能被立即接受:管道中无空间、网络流控制),会产生阻塞;
  • 对于read函数调用,在有些情况下(如数据不存在,如管道、终端设备和网络设备),会产生阻塞。
  • 有时候不希望有此种阻塞,因此可以在open时,用O_NONBLOCK来指定文件的模式为非阻塞模式。也可以使用ioctl函数来设定对文件描述符的操作为非阻塞模式。

2、文件记录锁:有时对一个文件进行锁时只锁住其中的一部分区域,此时文件记录锁(字节范围锁)即可实现这种效果。

  • fcntl函数:int fcntl (int fields, int cmd, struct flock *flockptr);其中flock结构包含了操作的锁定类型、锁定文件的区域、以及PID参数。
  • 锁定隐含继承和释放:
    • 继承:当用execl函数创建进程时,因为新进程和父进程具有相同的PID,因此锁是隐含继承的;
    • 释放:当一个进程终止时,则进程建立的锁全部被释放;
    • 解释:因为每把锁定标识号是PID,存放在文件的i节点当中。
3、STREAMS:流是构造内核设备驱动程序和网络协议包的一种通用方法,其为用户进程和设备驱动程序之间提供了一个全双工通道。

  • 数据可以顺流而下,也可以逆流而上,这取决于数据的传输方向;
  • STREAMS消息:STREAMS是以消息的形式来传输数据的。消息通常分为三部分:消息类型、可选控制信息和可选择的数据,而控制部分和数据部分用相同数据结构表示,包含了maxlen、len、和buf;而消息类型分为M_DATA、M_PROTO和M_PCPROTO,而消息是自动产生的,putmsg和putpmsg用不同的参数会产生不同的消息类型。
  • 写:write、putmsg、putpmsg(可以指定波段);
  • 读:read、getmsg、getpmsg(可以指定波段);由于read只能读取数据,故需要对read模式进行设置(RNORM\RMSGN\RMSGD)
4、I/O多路转换:当需要对多个描述符的状态进行判断时,若采用轮询,则会浪费CPU资源。若采用线程,但是需要同步线程。还可以采用异步I/O但是并不是每一种系统都支持。

  • select函数:int select(int masfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict tvptr);
  • FD_ISSET、FD_CLR、FD_SET、FD_ZERO
  • poll函数,poll函数和select函数功能相似,只不过poll函数对于每一个文件描述符,用结构体去测试其状态。
5、writev和readv函数:用于集中写和散步读

6、writen和readn函数:用于固定读或写多少个字节

7、存储映射I/O:将磁盘文件与存储空间中的一个缓冲区相映射,对缓冲区进行操作就相当于对文件进行操作。

  • void *mmap(void *addr, size_t len, int prot, int flag, int fields, off_t off);其中的flag可以指定为MAP_SHARED或MAP_PRIVATE。

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在 Android 开发中,Fragment 是界面的一个模块化组件,可用于在 Activity 中灵活地添加、删除或替换。将 ListView 集成到 Fragment 中,能够实现数据的动态加载与列表形式展示,对于构建复杂且交互丰富的界面非常有帮助。本文将详细介绍如何在 Fragment 中使用 ListView。 首先,需要在 Fragment 的布局文件中添加 ListView 的 XML 定义。一个基本的 ListView 元素代码如下: 接着,创建适配器来填充 ListView 的数据。通常会使用 BaseAdapter 的子类,如 ArrayAdapter 或自定义适配器。例如,创建一个简单的 MyListAdapter,继承自 ArrayAdapter,并在构造函数中传入数据集: 在 Fragment 的 onCreateView 或 onActivityCreated 方法中,实例化 ListView 和适配器,并将适配器设置到 ListView 上: 为了提升用户体验,可以为 ListView 设置点击事件监听器: 性能优化也是关键。设置 ListView 的 android:cacheColorHint 属性可提升滚动流畅度。在 getView 方法中复用 convertView,可减少视图创建,提升性能。对于复杂需求,如异步加载数据,可使用 LoaderManager 和 CursorLoader,这能更好地管理数据加载,避免内存泄漏,支持数据变更时自动刷新。 总结来说,Fragment 中的 ListView 使用涉及布局设计、适配器创建与定制、数据绑定及事件监听。掌握这些步骤,可构建功能强大的应用。实际开发中,还需优化 ListView 性能,确保应用流畅运
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值