《Unix系统编程手册》第四章 通用的I/O模型

Linux/Unix系统编程权威指南:深入实践手册 在Linux/Unix系统中,进程是一个程序的执行实例,它包含程序代码、其当前的活动、分配给它的处理器时间、分配给它的内存空间以及系统资源等。进程是系统进行资源分配和调度的一个独立单位。进程主要分为以下几类:用户进程:这是用户应用程序运行时创建的进程。用户进程通常在用户空间运行,并通过系统调用请求操作系统服务。系统进程:这是由操作系统启动并执行特定系统任务的进程,例如守护进程。这些进程通常拥有比用户进程更高的权限。内核线程:这些是内核自身执行的操作,表现为内核线程。 阅读详情

打开文件:open()

open既能打开一个已存在的文件,也可以创造一个新文件。当调用open()创建新文件时,位掩码参数mode指定了文件的访问权限。如果open()未指定O_CREAT标志,则可以省略mode参数。

#include <sys/stat.h>
#include <fcntl.h>

int open(const char* pathname, int flags, ... /* mode_t mode*/);
// return file descriptor on success, or -1 on error
/*
*pathname	:路径名,如果是符号链接,会对其进行解引用
*flags		:位掩码,用于指定	文件的访问模式
*return		:成功返回文件描述符,失败则返回-1
*/

文件访问模式:

访问模式描述
O_RDONLY以只读方式打开文件
O_WRONLY以只写方式打开文件
O_RDWR以读写方式打开文件

flag参数除了使用文件访问标志外,还用了其他操作标志。其他open系统调用的flags参数值:

标志用途
O_CLOEXEC设置close-no-exec标志
O_CREAT如果文件不存在,则创建文件
O_DIRECT无缓冲的输入/输出
O_DIRECTORY如果pathname不是目录,则失败
O_EXCL结合O_CREAT使用,专门用于创建文件
O_LARGEFILE在32位系统中使用此标志 打开大文件
O_NOATIME调用read()时,不修改文件最近访问时间
O_NOCTTY不要让pathname成为控制终端
O_NOFOLLOW对符号链接不予解引用
O_TRUNC截断已有文件,使其长度为零
O_APPEND总在文件尾部追加数据
O_ASYNC当I/O操作可行时,产生信号通知进程
O_DSYNC提供同步的I/O数据完整性
O_NONBLOCK以非阻塞方式打开
O_SYNC以同步方式写入文件

通过fcntl()的F_GETFL操作可以获取到文件的访问模式。

open文件出错

在打开文件出现错误时,open()函数调用将会返回-1,并通过设置错误号errno来标识错误原因。可能的错误号有:

  • EACCES:文件权限不允许调用进程以flags参数指定的方式打开文件,可能是访问权限不够或者文件不存在等
  • EISDIR:所指定的文件为目录,而调用者企图对目录写入
  • EMFILE:进程所打开的文件描述符数量达到了进程资源限制的上限
  • ENFILE:文件打开数量达到了系统允许的上限
  • ENOENT:文件不存在且未指定O_CREAT标志,或者pathname所指定的路径有问题
  • EROFS:文件只读,无法以只写或者读写的方式打开
  • ETXTBSY:文件为可执行程序,且正在执行

读取文件内容:read()

read()系统调用从文件描述符fd所指代的打开文件中读取数据

#include<unistd.h>
ssize_t read(int fd, void *buffer, size_t count);

count参数指定最多能读取的字节数,buffer参数提供用来存放输入数据的内存缓冲区地址,且缓冲区至少应有count个字节。
如果read()调用成功,将会返回实际读取的字节数,如果遇到文件结束(EOF)则返回0,如果出现错误则返回-1。

数据写入文件:write()

write()系统调用将数据写入一个已打开的文件中。

#include<unistd.h>
ssize_t write(int fd, void* buffer, size_t count);
//return number of bytes written or -1 on error

buffer参数为要写入文件中数据的内存地址,count参数为想要从buffer写入文件的数据字节数,fd参数为文件描述符,指代数据要写入的文件。
对磁盘文件执行I/O操作时,write()调用成功并不能保证数据已写入磁盘。这是因为减少磁盘活动量和加快write()系统调用,内核会缓存磁盘的I/O操作。

关闭操作:close()

close()系统调用会关闭一个打开的文件描述符,并将其释放回调用进程,供进程继续使用。当一个进程终止时,会自动关闭已打开的所有文件描述符。

#include<unistd.h>
int close(int fd);
//return 0 on success or -1 on error

改变文件偏移量:lseek()

对于每个打开的文件,系统内核会记录其文件偏移量。文件偏移量是指执行下一个read()或write()操作的文件起始位置,会以相对于文件头部起始点的文件当前位置来表示。文件第一个字节的偏移量为0。

文件打开时,会将文件偏移量设置为指向文件开始,以后每次read()和write()调用将按顺序递进,对文件进行操作

针对文件描述符fd参数所指代的已打开文件,lseek() 系统调用按照offset和whence参数值调整该文件的偏移量。

#include<unistd.h>
off_t lseek(int fd, off_t offset, int 	whence);
//return new file offset if successful or -1 on error

offset参数指定了一个以字节为单位的数值。whence参数则表明应参照哪个基点来解释offset参数,主要有以下几个:
SEEK_SET:将文件偏移量设置为从文件头部起始点开始的offset个字节
SEEK_CUR:相对于当前文件偏移量,将文件偏移量调整offset个字节
SEEK_END:将文件偏移量设置为起始于文件尾部的offset个字节

lseek()并不适用于所有类型的文件,不允许将lseek()应用于管道、FIFO、socket或者终端。

文件空洞

从文件结尾后到新写入数据间的这段空间被称为文件空洞。从编程角度看,文件空洞中是存在字节的,读取空洞将返回0填充的缓冲区。

然而,文件空洞不占用任何磁盘空间。直到后续某个时点,在文件空洞中写入了数据,文件系统才会为之分配磁盘块。其优势在于与实际分配的空字节分配磁盘块相比,稀疏填充的文件会占用较少的磁盘空间。

通用I/O模型以外的操作:ioctl()

ioctl()系统调用为执行文件和设备操作提供了一种多用途机制。

#include<sys/ioctl.h>
int ioctl(int fd, int request, ... /*argp*/);
//Value returned on success depends on request, or -1 or error

fd参数为某个设备或已打开的文件描述符,request参数指定了将在fd上执行的控制操作。

UNIX程序员手册:编程技术与实践 本文还有配套的精品资源,点击获取 简介:《UNIX程序员手册》是深入学习UNIX系统的必备指南,它全面介绍了UNIX编程的技术和方法。本书覆盖了命令行操作、文件系统、进程管理、I/O处理、文本处理、网络编程、编译链接、信号机制、库函数和系统调用等多个关键知识点。通过此手册,读者可掌握UNIX下的编程基础,提升编写高效、可靠程序的能力。 1. UNIX系统基础与sh... 阅读详情

相关推荐

全面UNIX系统开发与编程指南

在计算机科学中,shell命令是用户与UNIX/Linux操作系统交互的基础。学习shell命令的使用是每个UNIX程序员的必经之路。网络通信模型定义了计算机之间如何交换数据,其中最重要的模型是客户端/服务器模型。在这个模型中,客户端发送请求到服务器,服务器响应这些请求。例如,Web浏览器向Web服务器请求网页,然后服务器通过HTTP协议发送所请求的内容。除了客户端/服务器模型外,还有点对点模型和发布/订阅模型。点对点模型适用于对等网络中,节点既是客户端也是服务器。

weixin_36282234的博客 1088

Linux/Unix系统编程手册 第四章:文件I/O:通用的I/O模型

。 转载于:https://www.cnblogs.com/pluse/p/6375687.html

weixin_30951231的博客 139

Android各个版本存储权限适配

虽然 Android10 上面提出了外部存储分区的概念,不过之前的版本中,我们只要为应用添加了。1、AndroidManifest添加权限设置。3、拒绝权限时跳转详细设置页面。就可以像之前的方式一样访问手机的外部存储空间。2、请求所有文件管理权限。

sig321的专栏 1844

Linux_UNIX编程手册-读书笔记-第四章(文件I/O:通用的I/O模型)

4.1 概述 所有执行I/O操作的系统调用都以文件描述符,一个非负数(通常是最小整数),来指代打开的文件。 针对每个进程,文件描述符都自成一套 应该就是每个进程相互之间文件描述符不冲突 在程序开始运行之前,shell代表程序打开这三个文件描述符:stdin,stdout,stderr. 这三个文件描述符默认指向shell运行所在终端。 四个主要的I/O系统调用: fd = open(pat...

weixin_43133795的博客 275

AD9371 官方例程构建及单音信号收发

项目构建基本流程和AD9361差不多,由于官方使用的ZCU102,记录下移植遇到的一些问题最终接收到正确的正弦波Errors: 0Errors: 0Errors: 0Errors: 0AD9361。

weixin_44630490的博客 2971

电赛控制组入门到实战:从电路板到PID算法的完整路径

本文详细介绍了电赛控制组从电路板制作到PID算法实战的完整学习路径。涵盖嘉立创电路设计、Keil5开发环境搭建、STM32F103C8T6核心板外设应用,重点解析PID算法在电机速度环与位置环中的调试技巧,并探讨OpenMV视觉模块与主控制器的协同工作,为电赛参赛者提供系统化的实战指南。

oauth7security的博客 745

Linux/UNIX系统编程手册笔记:文件I/O、进程和内存分配

本文深入解析了Linux文件I/O的核心逻辑,围绕通用I/O模型展开。文章首先阐述了文件I/O的概念,强调Linux"一切皆文件"的设计哲学,然后详细介绍了I/O操作的核心流程:通过open()获取文件描述符,使用read()/write()进行读写,最后调用close()释放资源。此外,还讲解了lseek()改变文件偏移量实现随机访问,以及ioctl()处理特殊设备操作。文章指出,统一的I/O接口设计使得程序能够透明地操作各种类型的文件,无需针对特定设备编写专用代码。

梅见十柒的博客 1301

YOLOv11改进,YOLOv11结合DynamicConv(动态卷积),CVPR2024,二次创新C3k2结构

DynamicConv(动态卷积)是一个用于提高卷积神经网络(CNN)性能的技术,核心思想是动态地生成卷积核(filter),而不是使用固定的卷积核。通过引入更多的计算灵活性和适应性来增强卷积操作的表达能力,进而提升模型的性能。专家选择:DynamicConv 通过引入多个“专家”(experts),每个专家学习特定的卷积模式。输入图像的不同部分会选择不同的专家进行卷积。动态卷积核生成:根据输入的不同特征,专家网络动态地生成卷积核,而不是使用固定的卷积核。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2261

Linux/unix系统编程手册-第四章 文件I/O 笔记(1)

Linux/unix系统编程手册-第四章 文件I/O 笔记(1) 所有执行I/O操作的系统调用都以文件描述符,一个非负整数(通常是小整数)来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道(pipe)、FIFO、socket、终端、设备和普通文件。针对每个进程,文件描述符都自成一套。 在程序运行之前,shell代表程序打开3种标准的文件描述符。程序继承了shell文件描述符...

qq_39965097的博客 353

RT-DETR改进策略【卷积层】| CVPR-2020 Strip Pooling 空间池化模块 处理不规则形状的对象 含二次创新

一、本文介绍 本文记录的是利用Strip Pooling模块优化RT-DETR的目标检测网络模型。Strip Pooling结合了长而窄的卷积核形状在一个空间维度上的长程关系捕捉能力和在另一个空间维度上的局部细节捕捉能力,有效地处理复杂的场景信息。这一机制通过采用1×N1×N1×N或N×1N×1N×1的池化核形状来适应不同的图像特征,提高模型对目标形状和分布的适应性。在场景解析网络中,Strip Pooling可以被用于提升对具有长程带状结构或离散分布目标的解析能力,特别是在复杂场景或不同对象布局条件下效果

Limiiiing的博客 580

数据分享:中国历年省、市、县行政区划shp(1949~2023年共计75年)

中华人民共和国县级以上行政区沿革》(三册,1949-1983年)“The Atlas of Changes of Administrative Regions of China”;《中华人民共和国行政区划沿革地图集》The yearly publications of “The Administrative Regions”, 1985-2014;每年的出版行政区划简册(1985-2014年)行政区划网:www.xzqh.org。行政区划网:www.xzqh.org。

J_Giser的博客 3685

Linux/UNIX系统编程手册笔记:系统和进程信息、文件I/O缓冲、系统编程概念以及文件属性

Linux系统信息与进程管理深度解析 本文系统介绍了Linux系统中获取系统和进程信息的核心机制,重点剖析了/proc文件系统和uname()函数的功能与应用。/proc作为虚拟文件系统,动态展示内核状态和进程详情,通过/proc/PID目录可查询进程状态、内存映射、文件描述符等关键信息,而/proc/cpuinfo、/meminfo等文件则提供系统硬件和资源使用情况。uname()函数则用于获取系统标识信息,包括内核版本、硬件架构等基础数据。文章通过具体代码示例演示了如何编程访问这些信息,并强调了这些工具

梅见十柒的博客 1118

52-Halcon-- smooth_object_model_3d函数功能(滑处理3D对象模型)

Halcon中smooth_object_model_3d算子详解 该算子用于3D模型平滑处理,提供三种算法:'laplacian'(快速去噪)、'taubin'(高质量防收缩)和'low_pass'(频域滤波)。核心参数包括迭代次数(默认5)、平滑强度(0-1)和边缘保护选项。典型应用包括扫描数据去噪、CAD模型光顺和逆向工程优化。支持自适应平滑、结合模型简化等高级技巧,并可通过分块处理优化大型模型性能。参数组合需根据具体场景选择,如快速去噪推荐拉普拉斯方法(5次迭代,强度0.3),特征保持推荐低通滤波(

weixin_45590420的博客 871

【亲测免费】 Linux UNIX系统编程手册

Linux UNIX系统编程手册 去发现同类优质开源项目:https://gitcode.com/ 书籍简介 《Linux/UNIX系统编程手册(上、下册)》是Linux与UNIX平台编程领域的一部经典之作,由Linux编程的资深专家Michael Kerrisk撰写。本书深入浅出地阐述了Linux/UNIX环境下的系统调用和库函数的详尽知识,每项讨论都配以丰富的代码示例,确保读者能够理解和掌握复...

gitblog_06608的博客 570

智能车图像处理4-入门级分析3 ---十字路口补线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

探索Linux与UNIX系统编程的宝典:《LINUX.UNIX系统编程手册(下册)》

探索Linux与UNIX系统编程的宝典:《LINUX.UNIX系统编程手册(下册)》 【下载地址】LINUX.UNIX系统编程手册下册下载分享 LINUX.UNIX系统编程手册(下册)下载 项目地址: https://gitcod...

gitblog_06644的博客 464

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

《Linux/UNIX系统编程手册》PDF

《Linux/UNIX系统编程手册》是一本深入探讨Linux和UNIX系统编程的权威指南。该书由Michael Kerrisk撰写,并由孙剑等人翻译,旨在为系统编程人员提供全面的、深入的技术资源和参考。书籍内容广泛,涵盖了从基础概念到高级技术的各个方面,包括但不限于文件I/O、进程和线程、进程间通信(IPC)、网络编程、信...

weixin_41026773的博客 346

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

其他备选的I/O模型--《linux/unix系统编程手册》

其他备选的I/O模型 1.当从一个管道读取数据时,如果管道中恰好没有数据,那么通常read()会阻塞。而如果管道中没有足够的空间保存待写入的数据时,write()也会阻塞,当在其他类型的文件如FIFO和套接字上执行I/O操作时也会出现相似的行为 2.非阻塞式I/O可以运用到管道,FIFO,套接字,伪终端以及其他一些类型的设备上 3.I/O多路复用,信号驱动I/O以及epoll都是用来实现同一

524

Linux-Unix系统编程手册学习笔记

Linux-Unix系统编程手册学习笔记

火雨(Nick) 2236

APUE笔记之1-5章:UNIX基础、标准、文件I/O、文件与目录、标准I/O库

第1章 UNIX基础知识 Unix体系结构 不带缓冲的I/O: 函数 open、read、write、lseek、close 提供了不带缓冲的I/O. 这些函数都使用文件描述符。 头文件 &lt;unistd.h&gt; 以及2个常量 STDIN_FILENO 和 STDOUT_FILENO 是 POSIX标准的一部分。 标准I/O: 比如, fgets, fputs,...

FinixLei的专栏 (https://github.com/FinixLei) 634

《Linux/UNIX系统编程手册》 英文版读书笔记 Alternative I/O Models63.2

63.2 I/O Multiplexing63.2.4 Comparison of select() and poll()Within the Linux kernel, select() and poll() both employ the same set of kernel internal poll routines. The implementation of the poll() sys

KingEasternSun的专栏 1293

Linux/Unix系统编程手册学习笔记

什么是操作系统、内核 内核的职责 进程调度(CPU切换,资源调度等) 内存管理 提供文件系统(文件的创建删除等) 创建和终止进程 对设备的访问(鼠标、键盘等输入输出设备) 联网 提供系统调用接口(API) 内核态与用户态 ...

良秋的专栏 1418

Linux/UNIX系统编程手册笔记:终端

Linux终端与I/O模型技术解析 终端深度解析 Linux终端是用户与系统交互的核心接口,分为物理终端和虚拟终端。通过终端设备文件(如/dev/tty*)进行管理,关键点包括: 终端属性控制:使用tcgetattr/tcsetattr函数和stty命令可配置输入输出行为 特殊字符处理:Ctrl+C等控制字符可通过termios结构体修改 I/O模式选择:规范模式适合命令行,非规范模式适合实时交互 高级控制:通过ANSI转义码实现光标控制、颜色显示等功能 备选I/O模型 Linux提供多种高效I/O模型来提

梅见十柒的博客 1517

Linux UNIX系统编程手册(上册).pdf资源推荐

Linux UNIX系统编程手册(上册).pdf资源推荐 【下载地址】LinuxUNIX系统编程手册上册.pdf资源介绍 《Linux UNIX系统编程手册(上册)》是一本深入探讨Linux和UNIX系统编程的权威指南,适合希望提升系统级编程技能的开发者。本书详细讲解了进程管理、线程管理、文件系统操作、I/O系统编程及网...

gitblog_06708的博客 498

POSIX文件I/O编程

POSIX是可移植操作系统接口的简写,英文全程是Portable Operating System Interface。最初由IEEE(Institute of Electrical and Electronics Engineers,IEEE)开发,目的是为了提高UNIX环境下的应用程序可移植性。实际上POSIX并不局限于UNIX,只要符合此标准的操作系统的系统调用是一致的,例如Linux和Microsoft Windows NT。POSIX是一组操作系统调用的规范,本节介绍其中的文件I/O编程规范。

weixin_52849254的博客 1368

linux系统编程 linux/unix系统编程手册,Linux/UNIX系统编程手册-基本概念

[德] Michael Kerrisk第2章 基本概念第3章 系统编程概念基本概念内核内核的职责:(Tasks performed by the kernel)进程调度(Process scheduling)内存管理(Memory scheduling)提供了文件系统(Provision of a file system)创建和终止进程(Creation and termination of pr...

weixin_30348079的博客 191
上一篇: 《Unix系统编程手册》第三章系统编程概念学习
i_actor
博客等级 码龄10年 12粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值