【Linux学习】文件系统 - 第二篇

news2024/9/23 7:33:01
🍑个人主页:Jupiter.
🚀 所属专栏:Linux从入门到进阶
欢迎大家点赞收藏评论😊

在这里插入图片描述

文章目录

    • `💡文件操作的系统接口`
      • `🍑open系统调用`
      • `⚡close系统调用`
      • `🦈write系统调用`
      • `🦅read系统调用`
    • `📚文件管理`
      • `📕文件描述符fd `
      • `🎈OS管理文件`
      • `🌈文件描述符的分配规则`


💡文件操作的系统接口

访问文件会访问到硬件,访问硬件必须要经过OS,所以OS必须提供对应的访问文件的系统调用。

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

上面的fopen fclose fread fwrite都是C标准库当中的函数,我们称之为库函数(libc)。而 open close read write lseek 都属于系统提供的接口,称之为系统调用接口。

在这里插入图片描述

🍑open系统调用

在这里插入图片描述
简单介绍

  • 参数:参数一:被打开文件的路径.
  • 参数二:标志位(这是一个32的位图,这样可以用 | 传递多个标志).
  • 参数三:当文件不存在,需要新建文件的时候,指明文件权限(受系统umask权限掩码的约束)。也就是当文件不存在的时候,我们需要用有三个参数的open。

设置权限掩码接口:umask( ) :只会影响调用它的进程所认为的掩码,其他进程不受影响。

常用的标志位
在这里插入图片描述
介绍几个常用的:
O_RDONLY:以读的方式打开。
O_WRONLY:以写的方式打开,在文件的开头开始覆盖式的写入,并不会将之前的内容清空。
O_CREAT:如果文件不存在,创建文件。
O_APPEND:在文件结尾处追加写入。
O_TRUNC:写入之前清空文件之前的内容。

返回值:
成功返回文件描述符fd,失败返回-1

⚡close系统调用

在这里插入图片描述
`

参数介绍

  • 被关闭的文件的描述符;

返回值介绍

  • 成功返回0,失败返回-1;

🦈write系统调用

在这里插入图片描述

参数介绍

  • 参数一:目标文件的文件描述符。
  • 参数二:要写入的字符串的起始地址。
  • 参数三:写入的字符串的长度。

返回值介绍

  • 成功返回所写的字符串大小,失败返回-1;

代码示例:

int main()
 {
     umask(0);
     int fd = open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
     if(fd==-1)
     {
         perror("open");
         return 1;
     }
     
     const char* msg="hello world";
     write(fd,msg,strlen(msg));                                                                                                          
  
     close(fd);
     
 	 return 0;
  }

🦅read系统调用

在这里插入图片描述
参数介绍

  • 参数一:读取的文件。
  • 参数二:将读取的内容放在buf里面。
  • 参数三:读取多大的内容。

返回值介绍

  • 成功返回读取的内容的字节大小,失败返回-1;

代码演示`:

     int fd = open("log.txt",O_RDONLY);                                                                                                
     if(fd==-1)
     {
         perror("open");
         return 1;
     }
     char buf[1024];
     ssize_t s = read(fd,buf,sizeof(buf));
     if(s>0)
     {
     	printf("%s\n",buf);
	 }

📚文件管理

📕文件描述符fd

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

0 & 1 & 2
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0标准输出1标准错误2.
0, 1, 2 对应的物理设备一般是:键盘,显示器,显示器

所以输入输出还可以采用如下方式:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
 
int main()
{
 char buf[1024];
 ssize_t s = read(0, buf, sizeof(buf));
 if(s > 0){
 buf[s] = 0;
 write(1, buf, strlen(buf));
 write(2, buf, strlen(buf));
 }
 return 0;
}

🎈OS管理文件

在这里插入图片描述

现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件。

🌈文件描述符的分配规则

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 
int main()
{
 int fd = open("myfile", O_RDONLY);
 if(fd < 0){
 perror("open");
 return 1;
 }
 printf("fd: %d\n", fd);
 
 close(fd);
 return 0;
}

输出:3.


当关闭0或者2,再观察

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 
int main()
{
 close(0);
 //close(2);
 int fd = open("myfile", O_RDONLY);
 if(fd < 0){
 perror("open");
 return 1;
 }
 printf("fd: %d\n", fd);
 
 close(fd);
 return 0;
}

运行结果:关闭0,fd=0;关闭2,fd=2;

结论·:
默认打开的三个流分别占用了 下标0 1 2 的位置。
文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的
最小的一个下标,作为新的文件描述符。


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

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

相关文章

在开关电源转换器中充分利用碳化硅器件的性能优势

在过去的几十年中&#xff0c;半导体行业已经采取了许多措施来改善基于硅 MOSFET &#xff08;parasitic parameters&#xff09;&#xff0c;以满足开关转换器(开关电源)设计人员的需求。行业效率標準以及市场对效率技术需求的双重作用&#xff0c;导致了对于可用于构建更高效…

Mysql中事务的读一致性问题,以及如何用MVCC解决

事务四大特性的实现&#xff1a; 原子性事务具有回滚的能力&#xff0c;InnoDB引擎使用undo log日志表来进行回滚操作。 持久性InnoDB引擎使用redo log日志表来保证数据的持久性。 事务的隔离性产生的问题&#xff1a; 脏读&#xff1a;一个事务读取到了另一个事务未提交的数…

Qt WebEngine播放DRM音视频

Qt WebEngine播放DRM受保护视频&#xff0c;前提是Qt WebEngine开启音视频编码器&#xff0c;能够支持网页上普通视频的播放。开启音视频编码器需要自己编译源码&#xff0c;这里不做介绍。 什么是DRM音视频 DRM视频是指数字版权管理&#xff08;Digital Rights Management&a…

70.加载功能菜单功能设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;69.搭建分析工具界面 以 69.搭建分析工具界面 它的代码为基础进行修改 效果图&#xf…

gif压缩大小但不改变画质?为网站性能加速的必备知识

在互联网时代&#xff0c;GIF 动图以其生动的表现力和视觉效果&#xff0c;在社交媒体、网站设计、数字营销等领域被广泛应用。然而&#xff0c;随之而来的一个问题是&#xff0c;GIF 文件的体积往往较大&#xff0c;这可能会导致网站加载速度变慢&#xff0c;影响用户体验。因…

练习实践-基础设施:搭建时钟同步服务器-基于chrony软件在centos7系统上的实现

参考来源&#xff1a;B站视频&#xff1a;up主&#xff1a;林哥讲运维 【一分钟学会&#xff1a;使用 chrony 部署企业 NTP 时间服务器】 https://chrony-project.org/comparison.html --chrony组织的比较 https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/…

Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (上)

本系列文章介绍 在和社区小伙伴们交流的过程中&#xff0c;我们发现大家最关心的问题从来不是某个具体的功能如何使用&#xff0c;而是面对一个具体的实战场景时&#xff0c;如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&…

基于全切片图像的结直肠癌肿瘤浸润性淋巴细胞和肿瘤-基质比率自动量化技术|文献精析·24-08-05

小罗碎碎念 今天分享的这一篇文章是一篇20年发表的文章&#xff0c;研究的是免疫组化相关的病理AI课题&#xff0c;当时用的是还是支持向量机和随机森林&#xff0c;在展望的部分提出CNN是未来的发展趋势。但是根据时间节点来看&#xff0c;当时Transformer已经发表了&#xf…

Sentine 源码分析之--ParamFlowSlot

前言&#xff1a; 上一篇我对 Sentinel 中的 AuthoritySlot、SystemSlot、GatewayFlowSlot 的相关源码进行了分析&#xff0c;本篇我们开始分析 ParamFlowSlot 相关的源码。 Sentinel 系列文章传送门&#xff1a; Sentinel 初步认识及使用 Sentinel 核心概念和工作流程详解…

实时数仓分层架构详解

首先&#xff0c;我们从数据仓库说起。 数据仓库的概念可以追溯到20世纪80年代&#xff0c;当时IBM的研究人员提出了商业数据仓库的概念。数据仓库概念的提出&#xff0c;是为了解决和数据流相关的各种问题&#xff0c;特别是多重数据复制带来的高成本问题。 数据仓库之父Bill …

敏捷与DevOps有什么不同?

在软件开发领域&#xff0c;敏捷和DevOps因其对效率、协作和交付高质量产品的关注而受到欢迎。尽管它们有不同的目标&#xff0c;敏捷和DevOps常常被交替使用。本文旨在阐明这些方法之间的区别和共性&#xff0c;展示它们如何无缝协同以产生结果。 图源自Browser Stack 了解敏捷…

uniapp开发微信小程序出现【错误: xx.js 已被代码依赖分析忽略,无法被其他模块引用】解决办法

报错信息 VM5208:9 app.js错误:Error: config.js 已被代码依赖分析忽略&#xff0c;无法被其他模块引用。你可根据控制台中的【代码依赖分析】告警信息修改代码&#xff0c;或关闭【过滤无依赖文件】功能。详情请查看&#xff1a;https://developers.weixin.qq.com/community/…

滑台模组如何满足特定生产需求?

滑台模组是一种可以进行近乎直线运动的自动化设备&#xff0c;用于将物体沿着平面上的轨道滑动。由导轨、传动结构和导向结构等组成。滑台模组可以通过电机驱动、气动驱动或液压驱动等方式进行移动。滑台模组的结构紧凑、操作简便&#xff0c;具有高精度、高稳定性和高可靠性的…

dijkstra其实是bfs?--重新定义dijkstra

dijkstra其实是bfs?--重新定义dijkstra 1前言2最短路径问题3没有边权的最短路--bfs算法4边权的加入5优先队列与dijkstra6后记 1前言 本文将介绍dijkstra算法全新的理解方式 建议新手对dijkstra有建议了解&#xff0c;强烈推荐这篇文章&#xff0c;无比详细 2最短路径问题 最…

sql注入sqli-labs第二-四关

目录 sql注入sqli-labs第二关 1、了解表的列数 2、连表查询 3、注入管理员账号密码 sql注入sqli-labs第三关 1、逃脱单引号&#xff0c;括号 ​编辑 2、了解表的列数 3、连表查询 4、注入管理员账号密码 sql注入sqli-labs第四关 1、逃脱双引号&#xff0c;括号 2、了…

3GPP入门

官网地址 3GPP – The Mobile Broadband Standard 协议下载链接 Directory Listing /ftp/specs/archive 总纲 重点series Signalling protocols ("stage 3") - user equipment to network24 series信令Radio aspects25 series3G 基础LTE (Evolved UTRA), LTE-Adva…

RCNA | RGOS日常管理和Windows常用网络命令

RCNA | RGOS日常管理和Windows常用网络命令 一、RGOS日常管理操作1. RGOS平台平台概述2. 常用登陆方式3. CLI模式 二、Windows常用网络命令1. ICMP协议2. Ping命令3. Tracert命令4. Windows其他命令 一、RGOS日常管理操作 RGOS操作系统最主要的三大特性是模块化、安全性、开放性…

anaconda下载库的方法

首先打开anaconda prompt&#xff08;桌面搜索&#xff09;&#xff0c;输入 conda activate &#xff08;项目名字&#xff09;然后pip install

ARMxy工控机使用Node-Red教程:开发环境、应用场景(1)

开发环境 Windows 开发环境&#xff1a;Windows 7 64bit 、Windows 10 64bit Linux 开发环境&#xff1a;Ubuntu18.04.4 64bit U-Boot&#xff1a;U-Boot 2018 Kernel &#xff1a;Linux-4.9.170 LinuxSDK&#xff1a;LinuxSDK-[版本号].tar.gz&#xff08;基于全志官方&a…

最新!2024年—华为认证HCIA考试报名攻略分享

HCIA HCIA是华为初级认证。HCIA认证定位于中小型网络的设计、实施和维护&#xff0c;也是三种级别认证中最初级的认证。 HCIA方向 HCIA认证条件 无 HCIA认证考试 考试代码: H12-811 考试类型: 笔试&#xff08;一科&#xff09; 试卷题型: 单选题、多选题、判断题、填空题…