深入理解linux中的文件(上)

embedded/2025/2/2 18:10:26/

1.前置知识:

(1)文章 = 内容 + 属性

(2)访问文件之前,都必须打开它(打开文件,等价于把文件加载到内存中)

        如果不打开文件,文件就在磁盘中

(3)谁会去访问一个文件,进程。进程被加载启动之后,运行到fopen,才会打开一个文件

    

2.C语言fopen函数:

#include <stdio.h>FILE *fopen(const char *path, const char *mode);
  • path: 指向你想要打开的文件路径的字符串。
  • mode: 字符串,指定文件的打开模式。

打开模式

mode 参数决定了文件是如何被打开的。常见的模式有:

  • "r": 只读方式打开文本文件。文件必须存在。
  • "w": 只写方式打开文本文件。如果文件存在则将其截断为零长度;如果文件不存在,则创建新文件。
  • "a": 追加方式打开文本文件。如果文件存在,则在文件末尾添加数据;如果文件不存在,则创建新文件。
  • "rb""wb""ab": 分别对应上面的二进制文件版本。
  • "r+""w+""a+": 对应的读写版本(既可读也可写)。
  • "rb+""wb+""ab+": 读写模式下的二进制文件版本。

 

3.系统级接口open:

open系统级接口,我们熟知的fopen是C语言的语言级接口,fopen底层封装的就是open

#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  • pathname: 指向你想要打开或创建的文件路径的字符串。
  • flags: 这个参数可以包含多个标志的按位或组合,用于指定文件的打开方式(例如:只读、只写、读写等)。
  • mode: 当创建新文件时(通过使用了 O_CREAT 标志),这个参数指定了新文件的权限模式。

常见标志

  • O_RDONLY: 只读方式打开文件。
  • O_WRONLY: 只写方式打开文件。
  • O_RDWR: 读写方式打开文件。
  • O_CREAT: 如果指定的文件不存在,则创建之。
  • O_TRUNC: 如果文件存在并且以写方式或者读写方式打开,则将其长度截断为0。
  • O_APPEND: 每次写操作前都会将文件指针移动到文件末尾。

返回值

成功时,open 函数返回一个新的文件描述符;失败时返回 -1 并设置 errno 来指示错误类型。

 

4.文件描述符(open函数的返回值) 

操作系统中,只认识  “文件描述符” :<0,代表打开文件失败

0  1  2 分别代表  键盘文件(标准输入)显示器文件(标准输出)显示器文件(标准错误流)

接下来打开的文件顺序是从3号开始 

 每一个进程,都可以打开多个文件,都有这样子的一个数组,用于存储各种的struct file

当进程打开文件成功之后,就会把数组的下标作为返回值fd1,放回给进程。

 

 

 C语言对操作系统中的文件操作进行了两个封装:

1.接口封装  fopen(C语言级接口) -> open(系统级接口)

2.类型封装  FILE (结构体,里面肯定包含文件描述符)-> int (文件描述符,下标)


http://www.ppmy.cn/embedded/158968.html

相关文章

AMS仿真方法

1. 准备好verilog文件。并且准备一份.vc文件&#xff0c;将所有的verilog file的路径全部写在里面。 2. 将verilog顶层导入到virtuoso中&#xff1a; 注意.v只要引入顶层即可。不需要全部引入。实际上顶层里面只要包含端口即可&#xff0c;即便是空的也没事。 引入时会报warni…

二叉树高频题目——下——不含树型dp

一&#xff0c;普通二叉树上寻找两个节点的最近的公共祖先 1&#xff0c;介绍 LCA&#xff08;Lowest Common Ancestor&#xff0c;最近公共祖先&#xff09;是二叉树中经常讨论的一个问题。给定二叉树中的两个节点&#xff0c;它的LCA是指这两个节点的最低&#xff08;最深&…

Elasticsearch的开发工具(Dev Tools)

目录 说明1. **Console**2. **Search Profiler**3. **Grok Debugger**4. **Painless Lab**总结 说明 Elasticsearch的开发工具&#xff08;Dev Tools&#xff09;在Kibana中提供了多种功能强大的工具&#xff0c;用于调试、优化和测试Elasticsearch查询和脚本。以下是关于Cons…

记7(激活函数+多层神经网络+梯度下降法及其优化

目录 1、激活函数1.1、sigmoid函数&#xff1a;2端饱和&#xff0c;下面2个函数都要幂运算&#xff0c;运算速度会比较慢1.2、ReLU函数&#xff08;Rectified Linear Unit&#xff0c;修正线性单元&#xff09;1.3、PReLU函数&#xff08;Parameteric Rectified Linear Unit&am…

国内flutter环境部署(记录篇)

设置系统环境变量 export PUB_HOSTED_URLhttps://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn使用以下命令下载flutter镜像 git clone -b stable https://mirror.ghproxy.com/https://github.com/<github仓库地址>#例如flutter仓…

PHP Mail:高效邮件发送解决方案详解

PHP Mail&#xff1a;高效邮件发送解决方案详解 引言 在互联网时代&#xff0c;邮件作为最常用的沟通方式之一&#xff0c;已经成为企业和个人不可或缺的通讯工具。PHP作为一种流行的服务器端脚本语言&#xff0c;在邮件发送方面具有天然的优势。本文将详细介绍PHP Mail&…

攻防世界 simple_php

&#xfeff;<?php show_source(__FILE__);//显示 PHP 文件的源码 include("config.php");// 包含了一个config.php文件 $a$_GET[a];//获取GET 参数 a 和 b $b$_GET[b]; if($a0 and $a) {echo $flag1; } if(is_numeric($b))//防止数字输入 {exit(); } if($b>1…

解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩

解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后&#xff0c;本文将介绍如何使用 OpenCV 对这些海报进行智…