Linux 操作文件的系统调用

一、系统调用

系统调用表现出来的形式和库函数看着是一样的,但是系统调用的实现是在内核中,一旦执行系统调用以后,会产生中断,陷入内核,内核去执行相应的代码。我们无法直接去执行内核的代码,系统调用执行以后会从用户态切换到内核态,内核帮我们去执行某一段代码。

系统调用与库函数的区别:
系统调用的实现在内核中,属于内核空间,库函数的实现在函数库中,属于用
户空间。
系统调用执行过程如下图:

在这里插入图片描述

二、操作文件的系统调用

文件描述符:文件描述符是一个整型,其实就是内核中打开的一个文件的id。

对于进程来讲,启动一个进程会有3个文件会被默认打开,这三个文件分别是标准输入,标准输出,标准错误输出文件,这3个打开文件在PCB中记录着,PCB中有一个文件表,文件表的下标为0代表第一个文件,即标准输入文件,下标为1代表第二个文件,即标准输出文件,下标为2代表第三个文件,即标准错误输出文件。在C语言中用stdin操作标准输入文件,用stdout操作标准输出文件,用stderr操作标准错误输出文件。在Linux中则用0,1,2来分别操作标准输入,标准输出,标准错误输出文件,也就是说返回值不是FILE*,而是文件描述符。

对文件的操作一般分为3步:
(1)打开文件
(2)读/写
(3)关闭文件

文件一般存放在磁盘,可以永久存储。

文件由内核来管理,内核有一个模块就是文件系统。

  1. open系统调用

(1)语法形式:

①用于打开一个已存在的文件

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

②用于新建一个文件,并设置访问权限

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

(2)参数解释:

①返回值:为文件描述符
pathname:将要打开的文件路径和名称
flags : 打开方式
如 O_WRONLY 只写打开
O_RDONLY 只读打开
O_RDWR 读写方式打开
O_CREAT 文件不存在则创建
O_APPEND 文件末尾追加
O_TRUNC 清空文件,重新写入
open调用还可以在flags参数中将上述可选的打开方式用“按位或”操作进行组合。
mode: 权限。如:“0600”

  1. write系统调用

(1)语法形式:

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

(2)参数解释:

fd :对应打开的文件描述符
buf:存放待写入的数据
count:计划一次向文件中写多少数据

  1. close系统调用

(1)语法形式:

int close(int fd); 

(2)参数解释:

fd:要关闭的文件描述符

  1. read文件调用

(1)语法形式:

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

(2)参数解释:

①返回值:为实际读到的字节数
fd:对应打开的文件描述符(读哪个文件)
buf:存放数据的空间(读到的内容放到哪里)
count:计划一次从文件中读多少字节数据 (期望读多少数据)

这四个方法是系统调用,是内核提供的接口。

【例】open系统调用,如果a.txt在当前目录已经存在,则不创建,直接以只写的方式打开,如果当前目录不存在a.txt,就创建a.txt,并以只写的方式打开。

代码如下:

在这里插入图片描述
编译并运行以上代码:

在这里插入图片描述

结果分析:

运行main程序,a.txt被创建,并将"hello"写入了a.txt。同时我们也可以看到a.txt的文件描述符为3,这是因为文件描述符0,1,2分别表示了操作标准输入,标准输出,标准错误输出文件,已经被占用了。

【注意】通过文件描述符1,也可以将所写的内容直接输出到屏幕上。

有以下代码:

在这里插入图片描述

编译并运行:

在这里插入图片描述

【例】先以只读的方式打开文件a.txt然后再读其中的内容

在这里插入图片描述

编译并运行以上代码:

在这里插入图片描述

可以看出,读到了文件a.txt中的5个字符"hello"。

如果一个文件的内容特别多,读一次读不完,就继续循环去读。执行read读文件如果读到了文件末尾是读不到数据的,当read的返回值为0时,就说明文件读完了。循环读不会在同一个地方读,执行一次read,文件中就会有一个偏移量,下一次执行read的时候就从文件偏移后的位置开始读。偏移量是会在执行了read操作之后自动往后挪的。例如:

(1)分两次去读a.txt中的内容:

在这里插入图片描述

编译及运行结果:

在这里插入图片描述

(2)当执行read将文件的内容读完之后再执行read:

在这里插入图片描述

编译并运行:

在这里插入图片描述

可以看出当执行read将文件中的内容读完之后,再执行read继续读的时候,它的返回值就变成了0,说明文件已经读完了。

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

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

相关文章

零基础看懂免费开源的Stable Diffusion

文章目录 前言Diffusion模型推理过程训练过程 Stable Diffusion模型参考 前言 前面一篇文章主要讲了扩散模型的理论基础,还没看过上篇的小伙伴可以点击查看:DDPM理论基础。这篇我们主要讲一下一经推出,就火爆全网的Stable Diffusion模型。St…

SQL-每日一题【1341. 电影评分】

题目 表:Movies 表:Users 请你编写一个解决方案: 查找评论电影数量最多的用户名。如果出现平局,返回字典序较小的用户名。查找在 February 2020 平均评分最高 的电影名称。如果出现平局,返回字典序较小的电影名称。 …

「鲸脸识别」已上线,夏威夷大学用 5 万张图像训练识别模型,平均精度 0.869

内容一览:人脸识别可以锁定人类身份,这一技术延申到鲸类,便有了「背鳍识别」。「背鳍识别」是利用图像识别技术,通过背鳍识别鲸类物种。传统的图像识别依赖于卷积神经网络 (CNN) 模型,需要大量训练图像,并且…

《3D 数学基础》12 几何图元

目录 1 表达图元的方法 1.1 隐式表示法 1.2 参数表示 1.3 直接表示 2. 直线和射线 2.1 射线的不同表示法 2.1.1 两点表示 2.1.2 参数表示 2.1.3 相互转换 2.2 直线的不同表示法 2.2.1 隐式表示法 2.2.2 斜截式 2.2.3 相互转换 3. 球 3.1 隐式表示 1 表达图元的方…

【C语言】每日一题(多数元素)

多数元素,链接奉上 方法 1.摩尔投票2.合理但错误的方法2.1暴力循环2.2排序求出中间元素中间元素 1.摩尔投票 先来简单的介绍摩尔投票: 摩尔投票是一种用来解决绝对众数问题的算法。 什么是绝对众数呢? 在一个集合中,如果一个元素…

PHP最简单自定义自己的框架model使用(七)

1、实现model使用效果 2、自动加载model,KJ.php //自动加载文件public static function _autoload($className){switch ($className){//自动model类case substr($className,-5)Model:$path MODEL./.$className..php;if(is_file($path)) include $path;break;//自动加载控制器…

机器学习理论笔记(一):初识机器学习

文章目录 1 前言:蓝色是天的机器学习笔记专栏1.1 专栏初衷与定位1.2 本文主要内容 2 机器学习的定义2.1 机器学习的本质2.2 机器学习的分类 3 机器学习的基本术语4 探索"没有免费的午餐"定理(NFL)5 结语 1 前言:蓝色是天…

隧道人员定位方案

针对隧道环境的人员定位方案,UWB定位技术同样可以提供高精度和可靠的定位服务。以下是一个可行的方案: 部署基站网络:在隧道内建立一个基站网络,基站需要均匀分布在各个关键位置,以确保全方位的覆盖。由于隧道的特殊环…

一、Dubbo 简介与架构

一、Dubbo 简介与架构 1.1 应用架构演进过程 单体应用:JEE、MVC分布式应用:SOA、微服务化 1.2 Dubbo 简介一种分布式 RPC 框架,对专业知识(序列化/反序列化、网络、多线程、设计模式、性能优化等)进行了更高层的抽象和…

SpringBoot集成Redis及Redis使用方法

目录 应用背景 Redis简介 更新问题 一:环境配置 1.1: 在pom.xml文件中添加依赖 1.2:配置SpringBoot核心配置文件application.properties 二:在Config文件夹中创建RedisConfig配置文件类 2.1:RedisTemplate中的几个角色&am…

基于安防监控EasyCVR视频汇聚融合技术的运输管理系统的分析

一、项目背景 近年来,随着物流行业迅速发展,物流运输费用高、运输过程不透明、货损货差率高、供应链协同能力差等问题不断涌现,严重影响了物流作业效率,市场对于运输管理数字化需求愈发迫切。当前运输行业存在的难题如下&#xf…

mysql-事务特性以及隔离机制

一.ACID 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。 1.逻辑架构和存储引擎 如上图所示,MySQL服务器逻辑架构从上往下可以分…

【密码学】维京密码

维京密码 瑞典罗特布鲁纳巨石上的图案看起来毫无意义,但是它确实是一种维京密码。如果我们注意到每组图案中长笔画和短笔画的数量,将得到一组数字2、4、2、3、3、5、2、3、3、6、3、5。组合配对得到24、23、35、23、36、35。现在考虑如图1.4所示的内容&a…

六、Linux系统下,文件操作命令都有哪些?

总括: 创建文件/文件夹:touch; 查看:cat/more; 复制:copy; 移动文件/文件夹:mv; 删除:rm; 1、创建文件 (1)语法&#x…

java实现docx,pdf文件动态填充数据

一,引入pom 根据需求引入自己所需pom org.apache.poi poi 4.1.1 org.apache.poi poi-ooxml 4.1.1 org.jxls jxls 2.6.0 ch.qos.logback logback-core org.jxls jxls-poi 1.2.0 fr.opensagres.xdocreport fr.opensagres.xdocreport.core 2.0.2 fr.opensagres.xdocrep…

最小生成树 — Prim算法

同Kruskal算法一样,Prim算法也是最小生成树的算法,但与Kruskal算法有较大的差别。 Prim算法整体是通过“解锁” “选中”的方式,点 -> 边 -> 点 -> 边。 因为是最小生成树,所以针对的也是无向图,所以可以随意…

MySql011——检索数据:过滤数据(使用正则表达式)

前提:使用《MySql006——检索数据:基础select语句》中创建的products表 一、正则表达式介绍 关于正则表达式的介绍大家可以看我的这一篇博客《Java038——正则表达式》,这里就不再累赘。 二、使用MySQL正则表达式 2.1、基本字符匹配 检索…

Java版企业电子招投标采购系统源码之首页设计 tbms

​ 功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查…

照耀国产的星火,再度上新!

国产之光,星火闪耀 ⭐ 新时代的星火⭐ 多模态能力⭐ 图像生成与虚拟人视频生成⭐ 音频生成与OCR笔记收藏⭐ 助手模式更新⭐ 插件能力⭐ 代码能力⭐ 写在最后 ⭐ 新时代的星火 在这个快速变革的时代,人工智能正迅猛地催生着前所未有的革命。从医疗到金融…

CEC2013(MATLAB):遗传算法(Genetic Algorithm,GA)求解CEC2013的28个函数

一、遗传算法GA 遗传算法(Genetic Algorithm,GA)起源于对生物系统所进行的计算机模拟研究,是一种随机全局搜索优化方法,它模拟了自然选择和遗传中发生的复制、交叉(crossover)和变异(mutation)等现象,从任…