【linux】第二天 linux系统调用及文件IO操作
目录一、系统调用1、概述2、系统调用和库函数区别3、系统调用及IO操作二、文件描述符1、概述2、文件描述符表对文件描述符的管理3、查看当前系统文件描述符最大数量ulimit -a三、文件IO的操作1、打开文件 open2、close 关闭文件描述符3、向文件写数据write4、read读取文件数据5、综合案例实现cp(copy)命令四、文件的阻塞特性1、open打开文件 默认为阻塞特性2、 open打开文件 设置为非阻塞特性3、通过fcntl设置文件的阻塞特性五、获取文件的状态信息六、文件目录操作1、打开目录(得到文件目录的句柄2、读取目录3、关闭目录一、系统调用1、概述系统调用 就是操作系统内核 提供给用户可以操作内核 一组函数接口。用户 借助 系统调用 操作内核。比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件可以通过时钟相关的系统调用获得系统时间或设置定时器等。进程的空间分为内核空间 和 用户空间。系统调用是属于操作系统内核的一部分运行在内核态下通过软件中断切换到内核态。2、系统调用和库函数区别系统调用 是内核提供的一组函数接口。库函数 是第三方用户提供的函数接口。如果库函数没有调用系统调用该库函数不能操作内核。比如字符串操作函数strcpy bzero如果库函数调用系统调用该库函数能操作内核。比如fopen fclose fwrite fget3、系统调用及IO操作系统调用是需要时间的程序中频繁的使用系统调用会降低程序的运行效率。 文件IO中缓冲区刷新机制需要内核管理库函数访问文件的时候根据需要设置不同类型的缓冲区从而减少了直接调用IO系统调用的次数提高了访问效率。二、文件描述符1、概述在 Linux的世界里一切设备皆文件我们可以系统调用I/O 的函 数Iinput,输入;0output..输出对文件进行相应的操作 ( open()、close()、write()、read()等。打开现存文件或新建文件时系统内核会返回一个文件描述符文件描述符用来指定已打开的文件。这个文件描述符相当于这个已打开文件的标号文件描述符是非负整数是文件的标识操作这个文件描述符相当于操作这个描述符所指定的文件。Linux将系统调用 打开或新建的文件 用非负整数来表示。而这个非负整数 就是文件描述 符。系统会为每一个进程文件 分配一个文件描述符表管理该进程的所有文件描述符。系统会为 每一个进程文件 打开三个文件描述符0,1,20标准输入设备键盘 scanf1标准输出设备终端printf2标准错误输出终端perror2、文件描述符表对文件描述符的管理文件描述符表 是通过 “位图” 来管理文件描述符。使用1024位0-1023二进制位管理位数代表 的就是文件描述符位上的值1表示打开值0表示关闭前三位0-2为标准文件描述符。打开文件的时候默认选择最小可用的文件描述符3给打开的文件用。3、查看当前系统文件描述符最大数量ulimit -a查看命令ulimit -a修改命令ulimit -n 2048三、文件IO的操作文件常用操作IO:open close read write1、打开文件 open头文件#includesys/type.h#includesys/stat.h#include funtl.h相关函数函数功能 打开文件如果文件不存在则可以选择创建。//二参数open用于 打开已存在的文件int open(const char *pathname, int flags);//三参数open用于 打开不存在的文件 mode是文件在磁盘上的权限int open(const char *pathname, int flags, mode_t mode);//返回值成功返回最小文件描述符失败返回-1参数pathname文件的路径及文件名flags打开文件的行为标志必选项O_RDONLY以只读方式打开,O_WRONLY以只写方式打开,O_RDWR以可读可写方式打开mode这个参数只有在文件不存在时有效指新建文件时指定文件的磁盘权限flags 文件的操作权限可选项和必选项按位或起来取值含义O_CREAT文件不存在则创建文件文件存在则先删除再重新创建文件使用此选项时需使用mode说明文件的权限O_EXCL如果同时指定了O_CREAT且文件已经存在则出错防止已有文件被删除O_TRUNC如果文件存在则清空文件内容O_APPEND写文件时数据添加到文件末尾O_NONBLOCK对于设备文件, 以O_NONBLOCK方式打开可以做非阻塞I/Omode文件在磁盘的用户权限磁盘文件的用户权限分类所有拥有者权限u、同组用户权限(g)、其他用户权限(o)权限分为读4、写2、执行1可以相互组合7---可读可写可执行 6---可读可写 5---可读可执行4---只读 3---可写可执行 2---只写 1---可执行mode的权限表示0xxx 每一个x都是4、2、1的组合如前第一个0代表其为八进制数0777 所有者、同组用户、其他用户都是可读可写可执行0666 所有者、同组用户、其他用户都是可读可写查看mode的系统权限掩码umask查看掩码命令umask文件的最终权限给定的权限异或掩码 ~umaskumask mode设置掩码mode为八进制数umask -S查看各组用户的默认操作权限2、close 关闭文件描述符头文件#includeunistd.h函数int close(int fd);功能 关闭已打开的文件参数 fd : 文件描述符open()的返回值返回值 成功0 失败 -1并存放在全局变量errno中注意close工作步骤先将文件描述符的数量-1当文件描述符的数量变为0的时候 系统回收文件描述符所占的内核空间。3、向文件写数据write头文件#includeunistd.h函数size_t write(int fd, const void *buf, size_t count);功能 把指定数目的数据写到文件fd中参数fd : 文件描述符buf : 数据首地址count : 写入数据的长度字节返回值 成功实际写入数据的字节个数 失败 - 14、read读取文件数据#includeunistd.hsize_t read(int fd, void *buf, size_t count);功能 把指定数目的数据读到内存缓冲区参数fd : 文件描述符buf : 内存首地址count : 读取的字节个数返回值 成功实际读取到的字节个数读完文件数据返回0 失败 - 15、综合案例实现cp(copy)命令举例cp b.txt test 将b.txt文件拷贝到test目录中#include stdio.h #include string.h #include unistd.h #include sys/types.h #include sys/stat.h #include sys/fcntl.h int main(int argc,char *argv[])//argc为传参个数指针数组argv存放每个参数的内容 { //判断参数是否正确./a.out a.txt test //若正确argc3argv[0]./a.out,argv[1]a.txt,argy[2]test if(argc!3) { printf(缺少参数); return 0; } //以只读的方式 打开a.txt文件 int fp_ropen(argv[1],O_RDONLY); if(fp_r0) { perror(open); return 0; } //以写的方式 在test目录中打开a.txt char filename[32]; sprintf(filename,%s/%s,argv[2],argv[1]); int fp_wread(filename,O_WRONLY|O_CREAT,0666); if(fp_w0) { perror(open); return 0; } //不同的从fd_r中读取文件数据 写入fd_w文件中 while(1) { unsigned char buf[128]; int lenread(fp_r,buf,sizeof(buf)); if(len0) break; printf(读取的数据大小为%d,len); write(fp_w,buf,sizeof(buf)); } //关闭文件 close(fp_r); close(fp_w); return 0; }四、文件的阻塞特性对于一些设备文件读写操作,如管道,套接字,标准设备文件,默认缓冲区没有数据读会带阻塞,默认缓存区满的状态,写也会阻塞。文件描述符决定阻塞和非阻塞而不是read write函数。文件描述符默认为阻塞的。1、open打开文件 默认为阻塞特性文件描述符 事先不存在用open。如果从终端输入的数据没有换行符默认调用read读终端设备就会阻塞。2、 open打开文件 设置为非阻塞特性3、通过fcntl设置文件的阻塞特性文件描述符事先存在用funtl。 功能改变已打开的文件性质fcntl针对描述符提供控制。头文件#includeunistd.h#includefcntl.h函数int fcntl(int fd, int cmd, ... /* arg */ );参数fd操作的文件描述符cmd操作方式arg针对cmd的值fcntl能够接受第三个参数int arg。返回值 成功返回某个其他值 失败-1fcntl函数有5种cmd功能复制一个现有的描述符cmdF_DUPFD获得设置文件描述符标记(cmdF_GETFD或F_SETFD)获得设置文件状态标记(cmdF_GETFL或F_SETFL)获得设置异步I/O所有权(cmdF_GETOWN或F_SETOWN)获得设置记录锁(cmdF_GETLK, F_SETLK或F_SETLKW)设置一个存在的文件描述符的阻塞特性的步骤fcntl获取文件描述符的状态标记修改获取到的 文件描述符的状态标记将修改后的状态标记 使用fcntl设置到文件描述符中五、获取文件的状态信息头文件#includesys/type.h#includesys/stat.h#includeunistd.h函数int stat(const char *path, struct stat *buf);int lstat(const char *pathname, struct stat *buf);功能 获取文件状态信息stat和lstat的区别 当文件是一个符号链接时lstat返回的是该符号链接本身的信息 而stat返回的是该链接指向的文件的信息。参数path/pathname文件名buf保存文件信息的结构体返回值 成功 0 失败: -1struct stat结构体说明struct stat { dev_t st_dev; //文件的设备编号 ino_t st_ino; //节点 mode_t st_mode; //文件的类型和存取的权限 nlink_t st_nlink; //连到该文件的硬连接数目刚建立的文件值为1 uid_t st_uid; //用户ID gid_t st_gid; //组ID dev_t st_rdev; //(设备类型)若此文件为设备文件则为其设 备编号 off_t st_size; //文件字节数(文件大小) blksize_t st_blksize; //块大小(文件系统的I/O 缓冲区大小) blkcnt_t st_blocks; //块数 time_t st_atime; //最后一次访问时间 time_t st_mtime; //最后一次修改时间 time_t st_ctime; //最后一次改变时间(指属性) };st_mode(16位整数)参数说明 :由于上述形式的测试是普通的因此POSIX定义了其他宏以便更简洁地编写st_mode中的文件类型测试S_ISREG(st_mode)是否是普通文件(regular file)S_ISDIR(st_mode)是否是目录文件(directory)S_ISCHR(st_mode)是否是字符设备(character device)S_ISBLK(st_mode)块设备(block device)S_ISFIFO(st_mode)管道S_ISLNK(st_mode)符号链接(软连接st_mode控件的文件模式组件定义了下列掩码值:六、文件目录操作读取一个目录下的所有文件名1、打开目录(得到文件目录的句柄头文件#includesys/types.h#includedirent.h函数DIR *opendir(const char *name);功能打开一个目录参数name目录名返回值 成功返回指向该目录结构体指针 失败NULL2、读取目录#includedirent.hstruct dirent *readdir(DIR *dirp);功能读取目录 调用一次只能读取一个文件参数 dirpopendir的返回值返回值 成功目录结构体指针 失败NULL结构体dirent说明struct dirent { ino_t d_ino; // 此目录进入点的inode off_t d_off; // 目录文件开头至此目录进入点的位移 signed short int d_reclen; // d_name 的内容长度, 不包含NULL 字符 unsigned char d_type; // d_type 所指的文件类型 char d_name[256]; // 文件名 };d_type相关数据3、关闭目录头文件#includesys/types.h#includedirent.h函数int closedir(DIR *dirp);功能关闭目录参数dirpopendir返回的指针返回值 成功0 失败-1

相关新闻

Cesium 实战 11 - 调整饱和度、对比度等参数,加载渲染美化影像底图

Cesium 实战 11 - 调整饱和度、对比度等参数,加载渲染美化影像底图

Cesium 实战 11 - 调整饱和度、对比度等参数,加载渲染美化影像底图 渲染美化影像底图核心代码 完整代码: 在线示例 2026年7月17日更新:搞了一个 Cesium 中文 API 镜像,这是相关介绍(Cesium-1.143 中文版 API),欢迎使用。 美化影像底图,其实就是相当于调整了图层亮度,…

2026/9/20 21:32:28 阅读更多 →
【pgSql 海量数据库操作记录】

【pgSql 海量数据库操作记录】

一、批量插入数据【测试用】1.1、sql 语法sql 模板DO $$ DECLAREi integer : 1; BEGINWHILE i < 10 LOOPINSERT INTO my_table (col1, col2, col3) VALUES (value1, value2, i);i : i 1;END LOOP; END $$;案例测试 sqlDO $$ DECLAREi integer : 1; BEGINWHILE i < 100 L…

2026/9/20 22:17:12 阅读更多 →
企业 RAG 的检索注入:让知识库吐出机密文档的攻击面

企业 RAG 的检索注入:让知识库吐出机密文档的攻击面

企业 RAG 的检索注入&#xff1a;让知识库吐出机密文档的攻击面 一、检索结果成为新的攻击入口 RAG 系统让大模型用企业私有知识回答问题。有人觉得只要不把机密写进模型权重&#xff0c;把知识放向量库按权限检索就够安全&#xff0c;这个判断只对了一半。问题在于&#xff1a…

2026/9/16 20:51:05 阅读更多 →

最新新闻

commitlint 规则配置完全指南:Level、Applicable 与 Value 的三种写法及内置规则全参考

commitlint 规则配置完全指南:Level、Applicable 与 Value 的三种写法及内置规则全参考

commitlint 规则配置完全指南&#xff1a;Level、Applicable 与 Value 的三种写法及内置规则全参考 【免费下载链接】commitlint &#x1f4d3; Lint commit messages 项目地址: https://gitcode.com/gh_mirrors/co/commitlint commitlint 通过「规则&#xff08;Rules&…

2026/9/21 15:52:59 阅读更多 →
Vue Router 命名视图(Named Views)实战指南:多出口布局与嵌套命名视图

Vue Router 命名视图(Named Views)实战指南:多出口布局与嵌套命名视图

前端路由 【免费下载链接】vue-router &#x1f6a6; The official router for Vue 2 项目地址&#xff1a; https://gitcode.com/gh_mirrors/vu/vue-router 点击查看 免费下载 命名视图&#xff08;Named Views&#xff09;是 Vue Router&#xff08;Vue 2 官方路由&#xff…

2026/9/21 15:52:59 阅读更多 →
CodeIgniter 3.0.2 升级至 3.0.3 实战指南:base_url 自动检测变更与 Host 头注入防护

CodeIgniter 3.0.2 升级至 3.0.3 实战指南:base_url 自动检测变更与 Host 头注入防护

CodeIgniter 3.0.2 升级至 3.0.3 实战指南&#xff1a;base_url 自动检测变更与 Host 头注入防护 【免费下载链接】CodeIgniter Open Source PHP Framework (originally from EllisLab) 项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter 本文面向正在使用 Code…

2026/9/21 15:51:58 阅读更多 →
使用 Native Image Gradle Plugin 集成 Reachability Metadata:从元数据仓库到 Tracing Agent 的完整实战指南

使用 Native Image Gradle Plugin 集成 Reachability Metadata:从元数据仓库到 Tracing Agent 的完整实战指南

使用 Native Image Gradle Plugin 集成 Reachability Metadata&#xff1a;从元数据仓库到 Tracing Agent 的完整实战指南 【免费下载链接】graal GraalVM compiles applications into native executables that start instantly, scale fast, and use fewer compute resources …

2026/9/21 15:51:58 阅读更多 →
FoundationDB Go 绑定(fdb-go)开发指南:安装、构建与事务编程实战

FoundationDB Go 绑定(fdb-go)开发指南:安装、构建与事务编程实战

FoundationDB Go 绑定&#xff08;fdb-go&#xff09;开发指南&#xff1a;安装、构建与事务编程实战 【免费下载链接】foundationdb FoundationDB - the open source, distributed, transactional key-value store 项目地址: https://gitcode.com/gh_mirrors/fo/foundationd…

2026/9/21 15:51:58 阅读更多 →
Moya 端点(Endpoint)深度指南:理解 Target 到 Endpoint 再到 URLRequest 的完整映射链路

Moya 端点(Endpoint)深度指南:理解 Target 到 Endpoint 再到 URLRequest 的完整映射链路

Moya 端点&#xff08;Endpoint&#xff09;深度指南&#xff1a;理解 Target 到 Endpoint 再到 URLRequest 的完整映射链路 【免费下载链接】Moya Network abstraction layer written in Swift. 项目地址: https://gitcode.com/gh_mirrors/mo/Moya Endpoint 是 Moya 中…

2026/9/21 15:51:58 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析&#xff1a;从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南&#xff1a;src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin &#x1f680;ViteVue3Gin拥有AI辅助的基础开发平台&#xff0c;企业级业务AI开发解决方案&#xff0c;内置mcp辅助服务&#xff0c;内置skills管理&#xff0c;…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址&#xff1a; https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件&#xff08;Full-featured Plugin&#xff09;是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事&#xff1a;用Flutter给OpenHarmony做一款游戏集合类的App&#xff0c;说白了就是把若干小游戏塞进一个壳里&#xff0c;用统一入口分发。这个方向本身不算新鲜&#xff0c;真正让我花了不少心思的&#xff0c;是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档&#xff0c;最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事&#xff1a;今天在表后面多加了两个空白行&#xff0c;明天给客户交稿前发现整个章节的编号全部错位&#xff0c;光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年&#xff0c;说实话&#xff0c;第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年&#xff0c;流量惨淡、功能臃肿、代码自己都懒得看第二遍之后&#xff0c;我才慢慢琢磨明白一个道理&#xff1a;第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →