【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/7/24 20:19:04 阅读更多 →
【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/7/24 20:19:04 阅读更多 →
企业 RAG 的检索注入:让知识库吐出机密文档的攻击面

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

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

2026/7/24 20:19:04 阅读更多 →

最新新闻

第五章 热力学第二定律(五)---逆卡诺循环与制冷系数

第五章 热力学第二定律(五)---逆卡诺循环与制冷系数

5.5 逆卡诺循环与制冷系数前面讨论的卡诺循环是一种热机循环。其目的是&#xff1a;工质从高温热源吸收热量&#xff0c;经过循环后对外输出机械功&#xff0c;并向低温热源放出剩余热量。如果将整个循环反向运行&#xff0c;就得到逆卡诺循环&#xff08;Reversed Carnot Cycl…

2026/7/24 20:28:06 阅读更多 →
ADXL355BEZ-RL7是一款低温漂数字三轴高精度加速度计

ADXL355BEZ-RL7是一款低温漂数字三轴高精度加速度计

型号介绍ADXL355BEZ-RL7 是一款密封式数字三轴 MEMS 加速度计&#xff0c;该芯片内置 20 位 Σ-Δ 模数转换器&#xff0c;软件可切换 2.048g、4.096g、8.192g 三档测量量程&#xff0c;2g 模式下分辨率可达 3.9μg/L&#xff1b;器件噪声水平行业领先&#xff0c;X、Y 轴噪声密…

2026/7/24 20:28:06 阅读更多 →
浏览器脚本如何优雅解决文档下载难题:kill-doc技术解析与实践指南

浏览器脚本如何优雅解决文档下载难题:kill-doc技术解析与实践指南

浏览器脚本如何优雅解决文档下载难题&#xff1a;kill-doc技术解析与实践指南 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档&#xff0c;但是相关网站浏览体验不好各种广告&#xff0c;各种登录验证&#xff0c;需要很多步骤才能下载文档&#xff0c;该脚…

2026/7/24 20:28:06 阅读更多 →
告别被动抢修!依托 DXB-1000S 助力石油企业实现光缆主动防御

告别被动抢修!依托 DXB-1000S 助力石油企业实现光缆主动防御

在能源版图中&#xff0c;石油不仅是流淌的 “黑金”&#xff0c;更是维系国家经济命脉的战略资源。从戈壁深处的油田到沿海繁忙的炼化厂&#xff0c;庞大的石油工业体系背后&#xff0c;是一张张看不见却至关重要的神经网络 —— 通信光缆。这些光缆承载着生产数据、调度指令与…

2026/7/24 20:28:06 阅读更多 →
语义字典:设计系统组件的语义覆盖层

语义字典:设计系统组件的语义覆盖层

本文是 Schema-As-Code 治理框架“语义契约化”阶段的收尾篇。 “语义契约化”阶段由三部分组成&#xff1a;语义契约、编译管线、语义字典。三者的依赖关系为&#xff1a;语义字典定义覆盖层与语义绑定规则&#xff0c;语义契约引用覆盖层写实例&#xff0c;编译管线校验覆盖层…

2026/7/24 20:28:06 阅读更多 →
Ant Design 6.5.2 发布:修复多组件问题,提升使用体验

Ant Design 6.5.2 发布:修复多组件问题,提升使用体验

阿里巴巴开源的企业级 UI 设计语言和 React 组件库 Ant Design&#xff0c;现已发布 6.5.2 版本&#xff0c;此次更新修复了多个组件的问题。 多组件边框问题修复 Button、Collapse 等多个组件的边框未响应全局 Design Token 的问题得到修复。这意味着在使用这些组件时&#xf…

2026/7/24 20:27:06 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化&#xff0c;核心特色&#xff1a;三维 X/Y/Z 三轴空间&#xff0c;所有散点分布在 0~10 立方体空间内&#xff1b;散点使用径向渐变实现立体 3D 圆球质感&#xff1b;支持鼠标 / 触屏拖拽画布&#xff0c;…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls&#xff1a;进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值&#xff0c;并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好&#xff0c;我是一名编程初学者&#xff0c;同时这也是我编程学习之路上的第一篇博客。在这里&#xff0c;我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手&#xff0c;目前在学习c语言&#xff0c;我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻