linux-文件的读写

操作系统一切皆文件,访问文件实际上就是访问硬件,因为文件都保存在硬件上,或者文件就是硬件,而要访问硬件,就需要操作系统提供的系统调用,所以c/c++函数中关于访问硬件设备,基本上是由系统调用封装而成的。

一切皆文件的本质

每一个外设的io方法实际上是不一样的,为了达到一切皆文件这个要求,所以每个外设,不同的硬件都封装了读取和写入的驱动方法接口,每个文件的结构体对象struct_file都会保存着这个对应驱动方法的地址,这样就可以做到即使底层实现方法不同,但给出的接口是一致的,所以上层调用不关心底层怎么实现,调用的接口是一样的就做到了一切皆文件。

比特位级别的标志位传递方式

例:

#define one 001

#define two 010

#define three 100

这三个都是只有一个比特位的二进制数字

而每一个比特位在的位置都有对应的功能,每一个功能都会跟输入的数字进行与运算,001&one就是真如果输入one进去,那个那个比特位为001的功能就可以被使用,如果想一次性使用多个功能,那么输入参数的时候,将多个宏定义或运算就可以了

在操作系统中,为了管理打开的文件,会将这些文件的的属性组织成struct file结构体,这些结构体会组成链表 。tast_struct 结构体会保存一个结构体的指针,这个指针指向的结构体包含一个 指针数组,如果这个进程有打开的文件,那么就会把这个文件的指针填充到这个数组空着的位置,数组位置的选择,是从0开始,找到最小的位置填充进去。这个实际上就是文件描述符表,可以通过文件描述符表来找到打开的文件,而文件描述符就是这个数组中的下标,通过下标来找到文件指针。

而多个文件描述符可能指向同一个文件,那么就会有一个计数器count来表示指向该文件的数量。

关闭文件,关闭文件实际上是将指针数组当中下标对应的位置置空,并将指向的文件当中的引用计数count--,如果count为0,则释放该文件结构,不为零则不释放。

重定向指令

重定向指令默认是将1也就是显示器重定向,可以>前面加个数字,将该数字对应的文件重定向,也可以一次性重定向多个用空格分隔开就行

fopen

FILE* fopen(const char* path,const char* mode);

返回值是文件指针,如果失败返回null

第一个参数是文件路径,第二个参数是以什么方式打开文件

w 以覆盖写入方式打开文件,先将文件清空再写入

r 以读方式打开文件

a以追加写入方式打开文件

fwrite

 第一个参数是要写入文件的字符串,第二个是输入的单位大小,第三个是单位数量,第四个是文件指针。

返回nmemb。

fread的返回值也是nmemb也就是单位个数

open

open是一个系统调用接口,第一个是文件路径,第二个参数是打开的模式,第三个参数是如果是以写方式打开,并且该文件不存在,允许自己设置该文件的权限。返回参数是一个整数,这个整数是一个文件描述符,这个文件描述符就是tast_struct里文件描述符表里文件指针数组保存的文件指针的下标。

打开模式选项

O_RDONLY 以读方式打开

O_WRONLY 以写方式打开

O_RDWR 以读写方式打开

O_CREAT 创建

O_APPEND 以追加方式打开 

O_TRUNC 打开文件时清空

第三个参数:

用八进制来确定权限,和指令chmod一样例:

0666

write

fd是文件描述符

buf 是字符串指针

count 是写入多少 

返回值是实际写入的个数

 read

 

fd是文件描述符

buf 是字符串指针

count 读取多少 

修改umask

关闭文件 

重定向

重定向的本质是在文件描述符表上,进行内核级别的拷贝

dup2

dup2是一个输出重定向的系统调用,oldfd是覆盖的文件标识符,newfd是被覆盖的文件标识符。

dup2本质上是把一个文件标识符所对应的文件指针复制到文件标识符数组中另一个文件标识符所对应的下标。 

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

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

相关文章

「实战应用」如何可视化 DHTMLX Scheduler 中的资源工作量?

DHTMLX Scheduler是一个全面的 UI 组件,用于处理面向业务的 Web 应用程序中复杂的调度和任务管理需求。但是,某些场景可能需要自定义解决方案。例如,如果项目的资源(即劳动力)有限,则需要确保以更高的精度分…

RNA-seq 差异分析的点点滴滴(2)

引言 本系列[1]将开展全新的转录组分析专栏,主要针对使用DESeq2时可能出现的问题和方法进行展开。 Tximeta:自动导入并附加元数据 Bioconductor 家族中的 tximeta 包,在 tximport 的基础上进行了扩展,不仅保留了原有功能&#xff…

Pycharm PyQt5 环境搭建创建第一个Hello程序

第一步: 创建Pycharm项目,下载包: pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/下载好了之后,可以看到相应包: PyQt5:PyQt5是一套Python绑定Digia QT5应用的框架。Qt库是最…

安装luasocket模块时提示“sudo: luarocks:找不到命令“问题,该如何解决?

大家好,我是袁庭新。分享一个我在使用luarocks来安装luarocks模块报错的解决方法。 在Unix系统中安装LuaRocks。本文我以CentOS 7.x系统为例,来讲解如何安装LuaRocks。 $ cd /opt $ wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz $ tar …

Axure安装步骤及免费替代方案

Axure作为一款强大的原型设计工具,因其丰富的功能而受到设计师的青睐。它包括动态面板、复杂表格编辑、协同设计和高保真原型设计等,这些功能可以简化复杂的设计流程,提高团队效率。本文将介绍Axure的安装方法,并探索一款新兴的Ax…

分布式数据库:架构、优势与实践应用

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 分布式数据库在现代信息技术中扮演着至关重要的角色,尤其在需要处理大规模数据和实现高可用性、可扩展性的应用中更是…

小试银河麒麟系统OCR软件

0 前言 今天在国产电脑上办公,需要从一些PDF文件中复制文字内容,但是这些PDF文件是图片转换生成的,不支持文字选择和复制,除了手工输入,我们还可以使用OCR。 1 什么是OCR OCR (Optical Character Recogni…

np.zeros_like奇怪的bug

import numpy as np aa np.array([[1,2,3],[2,3,3]]) cc np.random.randn(2,3) print(aa) print(cc)bb np.zeros_like(aa) print(bb)for i in range(bb.shape[0]):for j in range(bb.shape[1]):bb[i,j] cc[i,j]print(bb)结果如下 这里发现这个bb的结果是没有赋值的 正确做…

C++(Qt)软件调试---内存泄漏分析工具MTuner (25)

C(Qt)软件调试—内存泄漏分析工具MTuner (25) 文章目录 C(Qt)软件调试---内存泄漏分析工具MTuner (25)[toc]1、概述🐜2、下载MTuner🪲3、使用MTuner分析qt程序内存泄漏🦧4、相关地址&#x1f41…

apk反编译修改教程系列-----apk应用反编译中AndroidManifest.xml详细代码释义解析 包含各种权限 代码含义

在反编译apk应用中。需要增加或者减少有些apk功能或者权限类的修改。其中大多都在于 AndroidManifest.xml文件中。了解AndroidManifest.xml其中每串代码代表的含义对修改apk有着至关重要的作用。 通过博文了解💝💝💝💝 1💝💝💝💝----AndroidManifest.xml中代…

项目功能--运营数据统计

一、需求分析 通过运营数据统计可以展示出体检机构的运营情况,包括会员数据、预约到诊数据、热门套餐等信息。我们要通过一个表格的形式来展示这些运营数据。如下图: 二、代码实现 实现步骤: 步骤一:定义数据模型,通过…

电子制造行业Top5贴片机品牌

在电子制造业的快速发展中,SMT(Surface Mount Technology)表面贴装技术扮演着至关重要的角色。贴片机作为SMT生产线的核心设备,其性能直接关系到整个生产线的效率和产品质量。 SPEA作为全球领先的自动化测试设备服务商&#xff0…

【maven踩坑】一个坑 junit报错 但真正导致这个的不是junit的原因

目录 事件起因环境和工具操作过程解决办法结束语 事件起因 报错一: Internal Error occurred. org.junit.platform.commons.JUnitException: TestEngine with ID junit-vintage failed to discover tests报错二: Internal Error occurred. org.junit.pl…

拷贝和浅拷贝的区别,以及对于循环引用如何处理深拷贝

深拷贝和浅拷贝的区别,以及对于循环引用如何处理深拷贝 浅拷贝仅拷贝对象的第一层属性值,对于基本数据类型,会复制其值;对于引用数据类型,仅复制引用地址而不复制实际的对象内容。浅拷贝后的新对象与原对象中的引用类…

gitlab与jenkins

一 gitlab代码仓库 1.1 gitlab简介 GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。GitLab 具有很多功能,比如代码托管、持续集成和持续部署(CI/CD)、问题跟踪…

LeetCode 86.分隔链表

题目: 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 思路: 代码: /*** Definiti…

Qt/C++ 开源控件 可折叠的标签管理控件

在 Qt 开发中,许多项目需要处理标签管理功能,例如分类管理、标签筛选等需求。本文将分享如何利用 Qt/C 实现一个具备动态增删标签、展开折叠功能的控件。此控件由 TagWindow 和 TagItemWidget 两个类组成,前者负责整个标签管理窗口的布局与逻…

Jmeter中的监听器(三)

9--断言结果 功能特点 显示断言结果:列出所有断言的结果,包括通过和失败的断言。详细信息:显示每个断言的详细信息,如断言类型、实际结果和期望结果。错误信息:显示断言失败时的错误信息,帮助调试。颜色编…

七牛云上传图片成功,但是无法访问显示{error : document not found}

上传图片成功,但是访问不了的问题,直接把地址放进浏览器显示{error : document not found},直接访问 DCNF 404是符合预期的,因为还没有去空间复制外链,要访问实际存在的资源才可以的. 配置区域和访问域名 设置没问题了…

虚拟与现实交融,线上元宇宙会议应用场景有哪些?

随着科技的飞速发展,元宇宙技术正逐渐渗透到我们生活的各个领域,为企业会议、学术会议、行业展会以及文化娱乐等带来了前所未有的变革。线上元宇宙会议打破了地域和物理空间的限制,让人们能够在虚拟世界中实现跨时空的交互与合作。本文将深入…