Linux 操作文件的系统调用

news2025/1/16 1:00:09

一、系统调用

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

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

在这里插入图片描述

二、操作文件的系统调用

文件描述符:文件描述符是一个整型,其实就是内核中打开的一个文件的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.coloradmin.cn/o/885348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

烧烤炉跨境电商UL检测报告UL 2728A标准

烧烤炉是一种烧烤设备,可以用来做烤羊肉串、烤肉、烤蔬菜等烧烤食品。烧烤炉根据加热源的不同可以分为木炭烧烤炉、燃气烧烤炉和电热烧烤炉;根据烧烤形式的不同,可分为手动烧烤炉和自动烧烤炉;根据用途的不同,可分为家…

如何使用PE修改win10系统的开机密码

前言:忘记自已电脑密码的人真的是太可怜了,半年多的时间没在公司,公司电脑也有半年多没有碰过,导致再回公司上班电脑密码早就忘记了。平时各类电子设备,软件应用的密码都是设成一样的,公司电脑因为有保密机…

ACM模式专业集训

在笔试的时候,大部分都是ACM模式,这让我们习惯于leetcode刷题确实输入输出很难下手,有的时候,明明题可以做出来,但是就是因为输入输出比较欠缺,因此无缘笔试,所以我们在平常的时候应该多去用ACM…

Scratch 之 翻页器制作

众所周知,在原版scratch上有一块480360大小的屏幕。但是我们如果在scratch编译器上编一些文字比较多的文章时,就会发现:字太多舞台区大小不够用怎么办?别着急,看我怎么解决。 标题大家都看到了吧,这个作品解…

pe文件的Import table导入表的手工修复

一、实验目的: 实验提供了一个不能正常运行的程序,如果在正常运行的情况下,程序的功能是弹出一个messagebox,然后正常退出。要做的,是通过排查错误,找到问题所在,修改程序,使其正常运…

猿辅导发布素质教育品牌,助力孩子学习底层能力培养

近年来,我国教育改革逐步深化,发展素质教育已成社会共识。2022年教育部发布新课标,根据学生的核心素养要求,确定了各门课程具体目标,优化了课程内容结构。其中,跨学科学习、探究式学习成为了新的学习方式。…

bigemap如何添加在线高清卫星图?

一、先那安装bigemap 软件 BIGEMAP电脑全能版 下载连接:http://www.bigemap.com/reader/download/detail201802015.html 二、鼠标放在左上角选择地图源这里,点击第一个加号按钮 选择从配置文件添加在线地图 吧地图配置文件选择导入添加,勾选…

【取证】2022美亚杯资格赛个人赛

【取证】2022美亚杯资格赛个人赛 加载检材创建案件个人赛部分(共70题)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.6…

攻防演习常用威胁情报中心

攻防演习常用威胁情报中心 微步在线:https://x.threatbook.com/绿盟威胁分析中心:https://poma.nsfocus.com/奇安信威胁情报中心:https://ti.qianxin.com/360安全大脑:https://sc.360.net/360沙箱云地址“”https://ata.360.net/天…

使用pysnmp报错lambda错误

pip install pyasn10.4.8 pysnmp4.4.12 python - Takes exactly 3 arguments (4 given) - Stack Overflow

CorelDRAW2023(简称CDR23)官方最新中文版下载教程

CorelDRAW(简称CDR)是一款专业的图形设计软件。该软件是加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件。这款矢量图形制作工具软件广泛应用于商标设计、标志制作、封面设计、CIS设计、产品包装造型设计、模型绘制、…

树的子结构

声明 该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油! 原题链接 树的子结构https://leetcode.cn/leet…

每天一道leetcode:剑指 Offer 36. 二叉搜索树与双向链表(中等深度优先遍历递归)

今日份题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 示例 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于…

ps怎么压缩图片大小200k?图片压缩技巧来啦

ps是我们常用的一款图像处理软件,有很多功能,可以帮助我们有效地进行图片编辑和创造工作,当然用它也可以压缩图片的大小,如果你还不知道怎么用ps压缩图片大小,不妨继续看下去吧。 方法一:调整图片品质 1、…

用AI攻克“智能文字识别创新赛题”,这场大学生竞赛掀起了什么风潮?

文章目录 一、前言1.1 大赛介绍1.2 项目背景 二、基于智能文字场景个人财务管理创新应用2.1 作品方向2.2 票据识别模型2.2.1 文本卷积神经网络TextCNN2.2.2 Bert 预训练微调2.2.3 模型对比2.2.4 效果展示 2.3 票据文字识别接口 三、未来展望 一、前言 1.1 大赛介绍 中国大学生…

深度学习2:过拟合解决办法

1.通过噪声正则化解决过拟合问题 噪声正则化是一种解决过拟合问题的有效方法。该方法通过向训练数据添加随机噪声,从而使模型更加鲁棒,并减少对训练数据的过度拟合。噪声正则化可以通过多种方式实现。其中一种常见的方法是在输入数据中添加随机噪声。例…

2682. 找出转圈游戏输家

题目描述&#xff1a; n 个朋友在玩游戏。这些朋友坐成一个圈&#xff0c;按 顺时针方向 从 1 到 n 编号。从第 i 个朋友的位置开始顺时针移动 1 步会到达第 (i 1) 个朋友的位置&#xff08;1 < i < n&#xff09;&#xff0c;而从第 n 个朋友的位置开始顺时针移动 1 步…

华为OD机试 - 公共子串计算(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

AI助力林业有害生物防治,基于YOLOv5开发构建林业有害生物检测识别系统

林业有害生物防治是指针对危害森林健康的昆虫、病原菌、杂草等有害生物进行预防和控制的活动。这些有害生物可能会导致树木的衰弱、死亡&#xff0c;破坏森林生态系统的平衡&#xff0c;影响木材产量和质量&#xff0c;甚至对人类社会造成经济和环境损失。 以下是一些常见的林业…

MySQL数据库-进阶篇

进阶篇 一、MySQL体系结构 二、存储引擎 简介 存储引擎特点 InnoDB &#xff08;默认&#xff09; MyISAM Memory 存储引擎区别 存储引擎选择 ​​ 小结 三、索引 配置Linux版本的mysql --nodesp和--force linux防火墙相关操作 https://blog.csdn.net/weixin_437…