文件系统调用─── linux第17课

目录

linux 中man 2和man 3的区别

文件内容介绍

C语言文件接口

示例:

输出信息到显示器,你有哪些方法

总结:

系统文件I/O

文件类的系统调用接口介绍

示例

open 函数具体使用哪个,和具体应用场景相关,

write read close lseek ,类比C文件相关接口

open函数返回值

在认识返回值之前,先来认识一下两个概念: 系统调用 和 库函数

文件描述符fd

为什么打开文件myfile.txt的描述符是3不是0?


linux 中man 2和man 3的区别

文件内容介绍

        文件 = 内容+属性.

文件系统

  •         被打开的文件       -------内存中
  •         没有被打开的文件-------磁盘中

没打开文件之前,文件存储在磁盘, 进程想要访问文件之前 ,要打开文件(也就是将文件加载到内存中)

文件加载到内存中要被OS管理(先描述,再组织)

                                                         也就产生了文件的内核数据结构+文件的内容.(类似进程)

C语言文件接口

示例:

  1 #include<stdio.h>2 #include<string.h>3 #include<errno.h>4 5 int main()6 {7     FILE* fp =fopen("myfile.txt","w+");8     if(!fp) perror("fopen");9 10     int count =6;11     const char* ch ="hello world\n";12     while(count--)13     {14         fwrite(ch ,strlen(ch),1,fp);15     }16     fclose(fp);17     return 0;18 }

进程创建好了,默认先打开了三个输入输出流

  1. stdin   标准输入流       键盘
  2. stdout  标准输出流     显示器
  3. stderr  标准错误流      显示器

仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针

输出信息到显示器,你有哪些方法

printf("hello linux\n");const char* ch ="hello linux\n";
fwrite(ch ,strlen(ch), 1,stdout);
fpritf(stdout, "hello linux\n");
fputs("aaaa\n" ,stdout);

总结:

打开文件的方式

r     Open text file for reading. The stream is positioned at the beginning of the file.r+    Open for reading and writing.The stream is positioned at the beginning of the file.w     Truncate(缩短) file to zero length or create text file for writing.The stream is positioned at the beginning of the file.w+    Open for reading and writing.The file is created if it does not exist, otherwise it is truncated.The stream is positioned at the beginning of the file.a    Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file.a+   Open for reading and appending (writing at end of file).The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file.

系统文件I/O

前面在讲计算机冯诺依曼体系结构时讲过

  •         OS要确保底层的安全稳定,对于上层开发提供了一些系统调用(system call)接口,用于对硬件的访问(I/O)
  •         而上面C语言的库函数fopen可以打开文件, fwrite可以向文件中写入, 文件在磁盘上,可以推断出,这些C语言中这些文件I/O一定封装了系统调用接口.

文件类的系统调用接口介绍

        open接口可以在linux中输入查询

man 2 open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。flags的参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定一个且只能指定一个O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写返回值:成功:新打开的文件描述符失败:-1

flags是位图,  参数:  比如O_RDONLY是32位中只有一个为1的int.

因此,参数之间要用  |  或运算.

mode_t理解:第三个参数 mode用于指定创建文件时的权限(文件模式)。它仅在创建新文件时生效.

示例

  1. 创建一个新文件,权限为 0644(用户可读写,组和其他用户只读):

int fd = open("example.txt", O_CREAT | O_WRONLY, 0644);

open 函数具体使用哪个,和具体应用场景相关,

  • 如目标文件不存在,需要三参数的open创建,则第三个参数表示创建文件 的默认权限.
  • 目标文件存在,使用两个参数的open。

write read close lseek ,类比C文件相关接口

open函数返回值

在认识返回值之前,先来认识一下两个概念: 系统调用库函数

  • 上面的 fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数(libc)
  • 而, open close read write lseek 都属于系统提供的接口,称之为系统调用接口 回忆一下讲操作系统概念时,画的一张图
  • 也就是C语言的文件接口(fopen fclose fread fwrite ),封装了文件类的系统调用接口(open read write close),方便了二次开发.

文件描述符fd

通过对open函数的学习,我们知道了文件描述符就是一个小整数

在上面open示例代码中发现打出来的myfile.txt文件描述符fd=3

为什么打开文件myfile.txt的描述符是3不是0?

进程启动 ,默认打开三个标准的输入输出流

因为在打开文件myfile.txt前,就打开了三个文件(stdin stdout stderr),他们的文件描述符分别是0 ,1 ,2

验证:

(先描述,再组织) 当我们打开文件时,操作系统在内存中要创建相应的数据结构来 描述目标文件.

struct file就是文件的属性 ,类似进程的task_struct

OS想要管理进程创建了进程管理列表,文件同理,创建了文件管理列表(也是双链表)

正如图所示:左面是进程管理,右侧是文件管理

一个进程通常打开多个文件,如何让进程与文件关联?

  • 每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组(文件描述符表),每个元素都是一个指向打开文件的指针!

所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件

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

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

相关文章

【Go学习实战】03-2-博客查询及登录

【Go学习实战】03-2-博客查询及登录 读取数据库数据初始化数据库首页真实数据分类查询分类查询测试 文章查询文章查询测试 分类文章列表测试 登录功能登录页面登录接口获取json参数登录失败测试 md5加密jwt工具 登录成功测试 文章详情测试 读取数据库数据 因为我们之前的数据都…

警惕AI神话破灭:深度解析大模型缺陷与禁用场景指南

摘要 当前AI大模型虽展现强大能力&#xff0c;但其本质缺陷可能引发系统性风险。本文从认知鸿沟、数据困境、伦理雷区、技术瓶颈四大维度剖析大模型局限性&#xff0c;揭示医疗诊断、法律决策等8类禁用场景&#xff0c;提出可信AI建设框架与用户防护策略。通过理论分析与实操案…

Android 源码下载以及编译指南

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、下载AOSP前的准备二、国内网络下 clone 清华大学开源软件镜像三、编写Python脚本&#xff0c;开始下载android 源码四、源码下载工具包五、编译 一…

Windows 远程桌面多端口访问,局域网虚拟IP映射多个Windows 主机解决方案

情景 项目现场4G路由局域网中两台主机通过VPN连接到公司内网&#xff0c;实现远程管理&#xff0c;要求映射两个Windows 桌面进行管理。 目录 情景 网络 思路 已知 问题解决 1.客户端通过VPN进入内网路由器配置NAT 2.使用远程主机远程桌面功能&#xff1a;IP端口号访问 …

子数组问题——动态规划

个人主页&#xff1a;敲上瘾-CSDN博客 动态规划 基础dp&#xff1a;基础dp——动态规划-CSDN博客多状态dp&#xff1a;多状态dp——动态规划-CSDN博客 目录 一、解题技巧 二、最大子数组和 三、乘积最大子数组 四、最长湍流子数组 五、单词拆分 一、解题技巧 区分子数组&…

数据结构(蓝桥杯常考点)

数据结构 前言&#xff1a;这个是针对于蓝桥杯竞赛常考的数据结构内容&#xff0c;基础算法比如高精度这些会在下期给大家总结 数据结构 竞赛中&#xff0c;时间复杂度不能超过10的7次方&#xff08;1秒&#xff09;到10的8次方&#xff08;2秒&#xff09; 空间限制&#x…

使用Modelsim手动仿真

FPGA设计流程 在设计输入之后,设计综合前进行 RTL 级仿真,称为综合前仿真,也称为前仿真或 功能仿真。前仿真也就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。在完成一个设计的代码编写工作之后,可以直接对代码进行仿真,…

化工厂防爆气象站:为石油化工、天然气等领域提供安全保障

【TH-FB02】在石油化工、天然气等高危行业中&#xff0c;安全生产是至关重要的。这些行业常常面临着易燃易爆、有毒有害等潜在风险&#xff0c;因此&#xff0c;对气象条件的监测和预警显得尤为重要。化工厂防爆气象站作为一种专门设计用于这些特殊环境的气象监测设备&#xff…

Mysql InnoDB 行格式解析

该篇是学习笔记&#xff0c;笔记来源于《MySQL是怎样运行的&#xff1a;从根儿上理解MySQL》 InnoDB 是一个将表中的数据存储到磁盘上的存储引擎&#xff0c;所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的&#xff0c;所以需要把磁盘中的数据…

【测试框架篇】单元测试框架pytest(4):assert断言详解

一、前言 用例三要素之一就是对预期结果的断言。 何为断言&#xff1f;简单来说就是实际结果和期望结果去对比&#xff0c;符合预期就测试pass&#xff0c;不符合预期那就测试 failed。断言内容就是你要的预期结果。断言包含对接口响应内容做断言、也包含对落DB的数据做断言。…

基础玩转物联网-4G模块如何快速实现与MQTT服务器通信

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 硬件连接 2.4 检查驱动 3 连接MQTT服务器 3.1 创建MQTT监听Topic 3.2 打开配置工具读取基本信息 3.3 设置连接参数进行数据交互 4 总结 1 前言 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻…

平面机械臂运动学分析

平面机械臂运动学分析 一 整体概述1 研究步骤&#xff1a; 二 正向1 几何分析2 matlab 仿真模拟&#xff08;1&#xff09;实现效果&#xff08;2&#xff09;matlab代码&#xff1a; 3 DH矩阵计算法&#xff08;1&#xff09;计算公式&#xff08;2&#xff09;计算结果验证&a…

Hadoop、Hive、Spark的关系

Part1&#xff1a;Hadoop、Hive、Spark关系概览 1、MapReduce on Hadoop 和spark都是数据计算框架&#xff0c;一般认为spark的速度比MR快2-3倍。 2、mapreduce是数据计算的过程&#xff0c;map将一个任务分成多个小任务&#xff0c;reduce的部分将结果汇总之后返回。 3、HIv…

1.4 单元测试与热部署

本次实战实现Spring Boot的单元测试与热部署功能。单元测试方面&#xff0c;通过JUnit和Mockito等工具&#xff0c;结合SpringBootTest注解&#xff0c;可以模拟真实环境对应用组件进行独立测试&#xff0c;验证逻辑正确性&#xff0c;提升代码质量。具体演示了HelloWorld01和H…

thinkphp+mysql+cast解决text类型字段的文本型数字排序错误的方法 - 数据库文本字段排序ASC、DESC的失效问题

TP中使用cast order $lists AmdCommonTable::where(..............) ->field(*,CAST(w6 AS UNSIGNED) as sort) ->order(sort, asc) ->select() ->toArray(); 先转换为数字&#xff0c;再order by 效果对比 (1/2) 不ok - 直接order by 某字段 asc - 只能按照文本…

批量将 Excel 转换 PDF/Word/CSV以及图片等其它格式

Excel 格式转换是我们工作过程当中非常常见的一个需求&#xff0c;我们通常需要将 Excel 转换为其他各种各样的格式。比如将 Excel 转换为 PDF、比如说将 Excel 转换为 Word、再比如说将 Excel文档转换为图片等等。 这些操作对我们来讲都不难&#xff0c;因为我们通过 Office 都…

C语言每日一练——day_3(快速上手C语言)

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第三天。&#xff08;会连续更新&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…

RSA的理解运用与Pycharm组装Cryptodome库

1、RSA的来源 RSA通常指基于RSA算法的密码系统&#xff0c;令我没想到的是&#xff0c;其名字的来源竟然不是某个含有特别意义的单词缩写而成&#xff08;比如PHP&#xff1a;Hypertext Preprocessor(超文本预处理器)&#xff09;&#xff0c;而是由1977年提出该算法的三个歪果…

聊一聊 Android 的消息机制

聊一聊 Android 的消息机制 侯 亮 1 概述 在 Android 平台上&#xff0c;主要用到两种通信机制&#xff0c;即 Binder 机制和消息机制&#xff0c;前者用于跨进程通信&#xff0c;后者用于进程内部通信。 从技术实现上来说&#xff0c;消息机制还是比较简单的。从大的方面讲…

数据结构第八节:红黑树(初阶)

【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red和 Black 。 通过对 任何…