【Linux文件IO】系统IO详情

目录

一、前言

二、相关API介绍

2.1 open

2.2 read

2.3 write

2.4 lseek

2.5 close

三、简单示例

3.1 示例1

3.2 示例2


一、前言

在 Linux 系统编程中,系统 I/O(又称低级 I/O)是直接通过操作系统提供的系统调用实现的文件操作接口。本文主要讲解open、read、write、lseek、close的功能以及用法。

二、相关API介绍

2.1 open

函数原型

int open(const char*pathname,int flags,mode_t mode);

函数功能:打开或创建文件,返回文件描述符。

参数说明

1.pathname

要打开或者创建的目标文件

2.flags

打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成falgs。

参数

作用

O_RDONLY

只读(前三个三选一)

O_WRONLY

只写(前三个三选一)

O_RDWR

读写(前三个三选一)

O_CREAT

若文件不存在,则创建它,需要使用mode选项来指明新文件的访问权限

O_APPEND

追加写入

O_TRUNC

若文件存在则覆盖(清空文件内容)

3.mode

新建文件时,要指明的文件访问权限。如果文件不存在且flags包含O_CREAT,mode参数决定新文件的权限;若文件已存在,mode会被忽略。未设置O_CREAT时,mode参数即使存在也不会被使用。

通过3位八进制数表示权限,每位对应“所有者-组-其他用户”的权限总和:

  • 4:读(Read)
  • 2:写(Write)
  • 1:执行(Execute)

示例:

  • 0644:所有者读写(6=4+2),组和其他用户只读(4)。
  • 注意:数值前的0表示八进制格式,而非权限修饰符。

函数返回值

成功:新打开的文件描述符

失败:-1

open返回的文件描述符一定是最小的而且没有被使用的。

示例

int fd = open("test.txt", O_RDWR | O_CREAT, 0644);

注意点

  1. 实际权限 = mode & ~umask

umask是进程的默认权限掩码(如0022),用于屏蔽某些权限位。例如:若mode=0666(期望权限rw-rw-rw-),umask=0022,最终权限为0644(rw-r--r--) 。可通过umask(0)临时禁用掩码,强制使用mode的原始值 1。

  1. 即使创建文件时设置了权限(如0555禁止写),后续通过open返回的文件描述符仍可修改文件内容(权限检查仅在open时进行)。
  2. 权限的继承性:目录的权限影响其子文件的创建。若父目录无写权限,即使mode允许,也无法创建文件。

2.2 read

函数原型

ssize_t read(int fd, void * buf, size_t count);

函数功能:从文件描述符对应的文件中读取数据到缓冲区。

参数说明

  • fd:文件描述符。
  • buf:存储数据的缓冲区地址。
  • count:期望读取的字节数。

函数返回值

成功:读到的字节数

已到达文件尾:0

失败:-1

示例

char buffer[1024];
ssize_t bytes_read = read(fd, buffer, sizeof(buffer));

2.3 write

函数原型

ssize_t write (int fd, const void * buf, size_t count);

函数功能:将缓冲区数据写入文件描述符对应的文件。

参数说明

跟read类似

函数返回值

成功:已写入的字节数

失败:-1

示例

const char *data = "Hello, Linux!";
ssize_t bytes_written = write(fd, data, strlen(data));

2.4 lseek

函数原型

off_t lseek(int fd, off_t offset, int whence);

函数功能:调整文件读写指针的位置,支持随机访问。

参数说明

1.fd

文件描述符。

2.offset

偏移量,正前移,负后移。

3.whence

当前位置的基点

  • SEEK_SET:文件的开头
  • SEEK_CUR:文件指针的位置
  • SEEK_END:文件结尾

函数返回值

成功:文件当前位移

失败:-1

示例

off_t new_pos = lseek(fd, 0, SEEK_END); // 移动到文件末尾

2.5 close

函数原型

int close(int fd)

函数功能:关闭文件描述符,释放系统资源。

参数说明

1.fd

需要关闭的文件描述符。

函数返回值

成功:返回0;

失败:返回-1,并设置errno

示例

close(fd);

注意点

程序结束时未关闭的文件可能导致资源泄漏,但内核会自动关闭。

三、简单示例

3.1 示例1

功能:写入一定数据,然后在读取这些数据。其中涉及到文件指针的问题,中间也涉及到关不关闭文件描述符。

/********************************************************************** 版权所有: Copyright (c) 2023-2024  XXX Company. All rights reserved.* 系统名称: * 文件名称: main.c* 内容摘要: open write lseek read close函数的应用* 当前版本: * 作    者: nebula嵌入式* 设计日期: 2023-01-21 15:58* 修改记录: * 日    期          版    本          修改人          修改摘要
**********************************************************************/
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include<unistd.h>int main(int argc, char *argv[])
{int fd, num;fd = open("a.txt", O_RDWR|O_CREAT|O_TRUNC, 0777);printf("fd=%d\n", fd);printf("hello world!!!\n");num = write(fd, "this is demo!", strlen("this is demo!"));if(num>0){printf("data is save!\n");}else{printf("data save failed!");}printf("num=%d\n", num);lseek(fd, -num, SEEK_CUR);int len;char str[50]="";len = read(fd, str, num);printf("len=%d\n", len);if(len>0){printf("txt content:%s\n", str);}else if(len<0){printf("content read failed!");}else{printf("read over!\n");}close(fd);return 0;
}

3.2 示例2

功能:指定路径拷贝文件。

/********************************************************************** 版权所有: Copyright (c) 2023-2024  XXX Company. All rights reserved.* 系统名称: * 文件名称: main.c* 内容摘要: 简单的文件拷贝程序* 当前版本: * 作    者: nebula嵌入式* 设计日期: 2025-03-01 15:11* 修改记录: * 日    期          版    本          修改人          修改摘要
**********************************************************************/
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include<unistd.h>int main(int argc, char *argv[])
{int source_fd = -1, des_fd = -1;int ret = 0, file_size = 0;char buf[1024] = {0};if (argc != 3) {printf("missing parameter!\n");printf("./program source_addr des_addr\n");return -1;}des_fd = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0777);if(des_fd < 0){printf("open des fd failed!\n");close(des_fd);return -1;}source_fd = open(argv[1], O_RDONLY);if(source_fd < 0){printf("open source fd failed!\n");close(source_fd);return -1;}while((ret = read(source_fd, buf, sizeof(buf) - 1)) > 0){file_size += ret;if (write(des_fd, buf, ret) != ret) {perror("写入文件失败");break;}}if (ret < 0) {perror("读取文件失败");}printf("文件拷贝完成,共拷贝了 %d 字节\n", file_size);close(source_fd);close(des_fd);return 0;
}
./a.out cp_source_test.txt cp_des_test.txt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26707.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB代码:机器学习-分类器

本文包含三种机器学习分类器的MATLAB实现方式代码块&#xff1a;支持向量机、决策树、逻辑回归。 目录 SVM/支持向量机(Support Vector Machine) 原理 MATLAB实现 实例代码块 采用搜索确定参数 Decision Tree / 决策树 原理 MATLAB实现 实例代码块 Logistic Regressio…

DeepSeek赋能数据治理:数字转型智慧引擎,企业数治的全新解决方案

在数字化时代&#xff0c;数据已成为企业的核心资产&#xff0c;而数据治理则是企业实现数字化转型的关键环节。然而&#xff0c;传统数据治理面临着诸多挑战&#xff0c;如数据孤岛、数据质量参差不齐、治理效率低下等。 如今&#xff0c;随着人工智能技术的飞速发展&#xf…

火山引擎AI一体机-DeepSeek版来了

2025年伊始&#xff0c;DeepSeek 在各领域尽显其能。除常态公有云部署外&#xff0c;一些企业也希望将 DeepSeek 与本地数据、业务场景相融合&#xff0c;拥抱 AI 新未来。不过&#xff0c;算力基础设施缺失、模型交付周期长、推理性能不足、数据安全合规等技术和成本问题成为了…

Hadoop之02:MR-图解

1、不是所有的MR都适合combine 1.1、map端统计出了不同班级的每个学生的年龄 如&#xff1a;(class1, 14)表示class1班的一个学生的年龄是14岁。 第一个map任务&#xff1a; class1 14 class1 15 class1 16 class2 10第二个map任务&#xff1a; class1 16 class2 10 class…

IP属地是通过卫星定位的吗?如何保护用户隐私

在数字时代&#xff0c;网络空间成为了人们日常生活不可或缺的一部分。随着社交媒体、在线服务等平台的兴起&#xff0c;用户IP属地信息的重要性日益凸显。然而&#xff0c;关于IP属地是如何确定的&#xff0c;尤其是是否通过卫星定位这一问题&#xff0c;却常常引发公众的疑问…

20250225-代码笔记03-class CVRPModel AND other class

文章目录 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函数功能函数代码 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函数功能函数代码 三、class CVRPModel(nn.Module):forward(self, state)函数功能函数代码 四、def _get_encodi…

操作系统之文件系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

Linux操作系统5- 补充知识(可重入函数,volatile关键字,SIGCHLD信号)

上篇文章&#xff1a;Linux操作系统5-进程信号3&#xff08;信号的捕捉流程&#xff0c;信号集&#xff0c;sigaction&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;myLerningCode/l26 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 可重入…

Bandicam录屏软件,设置延时录制

Bandicam软件&#xff0c;又称班迪录屏&#xff0c;是一款简单好用的电脑屏幕录制软件&#xff0c;既可以录制PPT课程视频、网课视频&#xff0c;还可以游戏攻略视频等。该软件专门用来录制电脑的桌面视频&#xff0c;目前支持2种视频文件格式&#xff1a;avi和mp4。支持全屏或…

利用@WebMvcTest测试Spring MVC应用

文章目录 1. WebMvcTest概述2. 创建Spring Boot项目3. 创建主页控制器类4. 准备图片素材5. 创建主页模板视图6. 主页控制器测试类 6.1 创建主页控制器测试类6.2 运行单元测试方法 7. 启动应用&#xff0c;查看结果 7.1 启动应用7.2 访问项目首页 8. 实战小结 1. WebMvcTest概…

Java8面试

Java 8 有哪些新特性? &#x1f40e;Java 8五大神装特性&#x1f40e; Lambda表达式&#xff08;魔法调料&#xff09; 曼波觉得像速食魔法咒语&#xff01;(๑✧◡✧๑) // 传统写法&#xff08;像冗长菜谱&#xff09; new Thread(new Runnable() {public void run() {Syst…

【前端基础】Day 7 CSS高级技巧

目录 1. 精灵图 1.1 为什么需要精灵图 1.2 精灵图&#xff08;sprites&#xff09;的使用 2. 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 2.4 字体图标的引入 2.5 字体图标的追加 3. CSS三角形 4. CSS用户界面样式 4.1 更改用户鼠标样式 …

初步理解RNN和LSTM

RNN RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种能够处理序列数据的神经网络。这里的时序信息可以指例如对于这一句话 “我吃了一个苹果”&#xff0c;“苹果” 的词性和意思&#xff0c;在这里取决于前面词的信息&#xff0c;如果没…

【华为OD机考】华为OD笔试真题解析(18)--找出通过车辆最多的颜色

题目描述 在一个狭小的入口&#xff0c;每秒只能通过一辆车&#xff0c;假如车辆的颜色只有3种&#xff0c;找出N秒内经过的最多颜色的车辆数量&#xff0c;三种颜色编号为0、1、2。 输入描述 第一行输入的是通过的车辆颜色信息&#xff0c;[0,1,1,2]代表4秒钟通过的车辆颜色…

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除

目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话&#xff0c;相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…

【最后203篇系列】010 关于矩阵的一点思考

说明 今天拿起一本矩阵的书又翻了翻&#xff0c;毕竟AI搞到最后还得是数学。 我是感觉自己高数始终有点学的迷迷糊糊的&#xff0c;就打算这一年慢慢把矩阵部分扫一遍&#xff0c;毕竟这快肯定是实打实有用的。其他高级部分就等我发财之后再说了&#xff0c;哈哈。 内容 今…

(动态规划 最长递增的子序列)leetcode 300

这道题我第一眼反应就是暴力&#xff0c;但是暴力的话就是n*n-1*n-2*...n-(n-1) 也就是O(n^n)dfs做绝对超时 贪心也不行&#xff0c;这里是子序列&#xff0c;要考虑在ni的范围内考虑多种路线取最优&#xff0c;所以用动态规划 如何用动态规划呢&#xff1f; 答&#xff1a;…

本地大模型编程实战(26)用langgraph实现基于SQL数据构建的问答系统(5)

本文将将扩展上一篇文章完成的 langgraph 链&#xff0c;继续使用基于 langgraph 链 &#xff0c;对结构化数据库 SQlite 进行查询的方法。该系统建立以后&#xff0c;我们不需要掌握专业的 SQL 技能&#xff0c;可以用自然语言询问有关数据库中数据的问题并返回答案。主要完善…

Linux---共享内存

1.ipcs命令 IPC机制是一个让人烦恼的问题&#xff1a;编写错误的程序或因为某些原因而执行失败的程序将把它的IPC资源&#xff08;如消息队列中的数据&#xff09;遗留在系统里&#xff0c;并且这些资源在程序结束后很长时间让然在系统中游荡&#xff0c;这导致对程序的新调用…

RAG 阿里云

RAG-阿里云Spring AI Alibaba官网官网 RAG-阿里云Spring AI Alibaba官网官网 AI应用跑起来&#xff0c;取消一下航班的操作666