linux编程--文件系统处理常用函数

文件系统

这一个课程的笔记

文件存储相关的概念

文件描述主要有两个inode和dentry

inode

是一个结构体, 里面有这一个文件的权限, 类型, 大小, 时间, 用户, 盘块位置之类的信息, 这一个是文件属性的管理结构

image-20240319210915850

文件名是单独存储的, 可以使用inode的编号找到这一个结构体

创建一个硬链接的时候实际这两个文件的inode是一样的, 不一样的是dentry

dentry 目录项

这一个结构体里面有两个主要的变量(经常使用), 分别是文件名以及inode的编号, 可以使用这一个获取文件的信息

文件操作

stat函数:获取文件属性

实际上是从文件的inode结构体里面获取

int stat(const char *pathname, struct stat *statbuf);

参数1: 是一个文件的路径

参数2: 这一个实际返回值

image-20240319212528504

int fstat(int fd, struct stat *statbuf);使用的参数是一个文件的描述符
int lstat(const char *pathname, struct stat *statbuf);这一个函数的目标是一个软链接的时候返回的是这一个软链接的信息, 之前的几个函数返回的是软连接指向的文件

image-20240320203146019

image-20240319214505214

可以使用这几个宏定义进行文件的格式的获取, 这一个实际是使用一个16位的数据保存了这一个文件的数据类型, 这几个宏定义是判断这一个数字的高几位是什么, 这一个数据里面还有这一个文件的权限

其他位

image-20240320203124969

特殊权限位:

​ 包含三个二进制位。依次是:设置组ID位setGID;设置用户ID位setID;黏住位sticky

黏住位

早起计算机内存紧,只有精要的常用的程序可以常驻物理内存,剩下的要暂存磁盘中。当内存不够用的时候会将该部分程序存回磁盘,腾出内存空间。若文件设置了黏住位,那么即使在内存比较吃紧的情况下,也不会将该文件回存到磁盘上。由于现阶段操作系统的虚拟内存管理分页算法完善。该功能已经被废弃。

但我们仍然可以对目录设置黏住位。被设置了该位的目录,其内部文件只有:

①超级管理员

②该目录所有者

③该文件的所有者

以上三种用户有权限做删除、修改操作。其他用户可以读、创建但不能随意删除。

setUID位

进程有两个ID:EID(有效用户ID),表示进程履行哪个用户的权限。

​ UID(实际用户ID),表示进程实际属于哪个用户。

​ 多数情况下,EID和UID相同。但是,当文件的setID被设置后两个ID则有可能不一样。

​ 例如:当进程执行一个root用户的文件,若该文件的setID位被设置为1, 那么执行该文件时,进程的UID不变。EID变为root,表示进程开始履行root用户权限。

access检测文件权限

int access(const char *pathname, int mode);

F_OK , R_OK, W_OK, and X_OK. F_OK tests for the existence of the file. R_OK, W_OK, and X_OK test whether the file exists and grants read, write, and execute permissions, respectively.

成功的时候返回0, 这一个文件不存在或者这一个文件的某一个查询的文件不存在, 这个时候返回-1

chmod改变一个文件的权限

int chmod(const char *pathname, mode_t mode);

可以设置权限以及几个特殊位

  • 权限位

image-20240328171551848

  • 特殊位

image-20240328171630511

4.4 S_ISUID、S_ISGID位与文件访问权限检查-CSDN博客

大致意思是前面两个位设置的时候其他用户使用这一个文件的时候会使用这一个用户的拥有者的ID

后面是黏住位, 前面有

link创建一个硬链接

int link(const char *oldpath, const char *newpath);

这一个文件的路径, 以及硬链接的路径, 实际是为一个文件创建一个新的dentry

返回0表示成功

unlink删除一个文件

int unlink(const char *pathname);

删除一个文件的目录项, 这一个文件的目录项为0的时候这一个文件会被删除, 这一个文件不是立刻被删除的, 实际的删除是操作系统处理的, 如果有一个其他的进程使用这一个文件, 这一个文件会在打开这一个文件的进程结束以后再释放这一个文件

可以使用这两个函数实现一个mv命令, 先为这一个文件创建一个dentry, 再把旧的dentry移除

隐式回收

一个进程结束以后, 这一个进程打开的资源会被回收, 包括打开的文件, 申请的空间

symlink软连接

int symlink(const char *target, const char *linkpath);

为文件创建一个软连接, 实际是一个记录文件路径的字符串

readlink从一个链接获取文件路径

ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);

把这一个文件的路径放在这一个buf里面, 如果这一个buf很小, 这一个路径会被截断

rename给一个文件重命名

int rename(const char *oldpath, const char *newpath);

如果这一个新的文件已经存在, 这一个文件会被替代

目录操作

getcwd获取位置

获取进程当前工作目录 (卷3,标库函数)

char *getcwd(char *buf, size_t size); 成功:buf中保存当前进程工作目录位置。失败返回NULL。

chdir变换路径

改变当前进程的作目录, 相当于cd

int chdir(const char *path); 成功:0;失败:-1设置errno为相应值

文件目录权限

如果使用vi打开一个目录, 可以获取这一个目录里面的文件名(目录项)

rwx
文件文件的内容可以被查看内容可以被修改可以运行产生一个进程
cat、more、less…vi、> …./文件名
目录目录可以被浏览 ls tree创建、删除、修改文件 touch rm mkdir可以被打开、进入 cd

目录设置黏住位:若有w权限,创建不变,删除、修改只能由root、目录所有者、文件所有者操作。

opdir打开一个目录

DIR *opendir(const char *name);

成功的时候返回描述符, 失败的话会返回NULL

closedir关闭这一个文件

int closedir(DIR *dirp);

0: 成功, -1失败

readdir返回目录里面一个目录的描述符

struct dirent *readdir(DIR *dirp);

image-20240320213727817

这一个是获取这一个文件夹里面的文件的目录项

:使用这一个函数的时候需要注意这一个函数可以获取到. 和 … 目录, 遍历的时候要注意不要死循环

rewinddir返回文件夹的开头

void rewinddir(DIR *dirp);

这一个函数主要用于遍历文件的时候, 从头再开始

telldir/seekdir函数

​ 获取目录读写位置

​ long telldir(DIR *dirp); 成功:与dirp相关的目录当前读写位置。失败-1,设置errno

​ 修改目录读写位置

​ void seekdir(DIR *dirp, long loc); 返回值:无

​ 参数loc一般由telldir函数的返回值来决定。

dup/dup2重定向文件

这一个在命令行里面的形式的>(把输出的信息添加到文件)或者>>(追加)

int dup(int oldfd);
int dup2(int oldfd, int newfd);

dup2实际是把后面的那一个文件指向前一个文件, 使用的时候如果newfd这一个描述符被使用了, 会把这一个描述符覆盖

还可以使用fcntl的F_DUPFD实现同样的功能, 但是如果new放到位置的文件被使用的时候这一个文件不会被覆盖, 而是使用比他大的第一个可以使用的描述符

可以使用这两个函数配合exec系列函数实现比如 ls -l > wc的功能

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

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

相关文章

边缘计算AI盒子目前支持的AI智能算法、视频智能分析算法有哪些,应用于大型厂矿安全生产风险管控

一、前端设备实现AI算法 主要是基于安卓的布控球实现,已有的算法包括: 1)人脸;2)车牌;3)是否佩戴安全帽;4)是否穿着工装; 可以支持定制开发 烟雾&#xf…

HarmonyOS入门--ArkTS--基本语法

文章目录 ArkTSArkTS声明式开发范式的基本组成基本语法声明式UI创建组件配置属性配置事件配置子组件 自定义组件基本结构成员函数/变量build()函数自定义组件通用样式自定义组件的创建和渲染流程自定义组件重新渲染自定义组件的删除 Builder装饰器全局自定义构建函数组件内部的…

【NLP笔记】大模型prompt推理(提问)技巧

文章目录 prompt概述推理(提问)技巧基础prompt构造技巧进阶优化技巧prompt自动优化 参考链接: Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing预训练、提示和预测:NL…

软件杯 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 *…

基于单片机产品数量自动计量智能系统设计

**单片机设计介绍,基于单片机产品数量自动计量智能系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机产品数量自动计量智能系统设计是一个融合了单片机技术、传感器技术和自动控制技术的综合性项目。…

uniApp使用XR-Frame创建3D场景(8)粒子系统

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 本片我们详细讲解一下xr-frame的粒子系统 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{{sec8}}"><xr-asset-load t…

基于ssm的线上旅行信息管理系统论文

摘 要 随着旅游业的迅速发展&#xff0c;传统的旅行信息查询管理方式&#xff0c;已经无法满足用户需求&#xff0c;因此&#xff0c;结合计算机技术的优势和普及&#xff0c;特开发了本线上旅行信息管理系统。 本论文首先对线上旅行信息管理系统进行需求分析&#xff0c;从系…

将ENVI的roi转为mask图像

方法1&#xff1a; 直接使用ENVI step1: 将roi文件存储为.roi格式 [1] 链接: link step2: 将.roi转为mask [2] 链接: link [3] 链接: link 方法2&#xff1a; 使用Matlab step1: 将roi文件存储为.xlm 文件 step2&#xff1a;针对把每个roi存储为一个单独文件 [4] 读取xlm文…

Electron+Vue构建项目时出错:Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT

问题&#xff1a;ElectronVue构建项目时出错&#xff1a;Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT URL:https://github.com/nklayman/vue-cli-plugin-electron-builder/issues/1701 一&#xff0c;构建时node版本要低 同时构建命令如下&#xff1a; "el…

fastadmin学习04-一键crud

FastAdmin 默认内置一个 test 表&#xff0c;可根据表字段名、字段类型和字段注释通过一键 CRUD 自动生成。 create table fa_test (id int unsigned auto_increment comment ID primary key,user_id int(10) default 0 null…

免费软件“蓝莓投屏”:支持多个Airplay同时镜像的投屏软件。

引言&#xff1a; 由于定制盒子(3288)不支持投屏功能&#xff08;有些5.1不支持&#xff0c;安卓4.X本身也不支持&#xff09;&#xff0c;需要借助第三方的投屏软件来实现这一需求。所以&#xff0c;研究半天&#xff0c;蓝莓投屏以其简便易用的特性脱颖而出&#xff0c;只需…

每日一题--最长连续序列

洛阳春-岑参 人到洛阳花似锦&#xff0c;偏我来时不逢春。 谁道三冬无春色&#xff0c;冰山高处万里银 目录 题目描述 思路分析 方法及其时间复杂度 法一 暴力枚举&#xff1a; 法二 哈希表遍历&#xff1a; 法三 并查集&#xff1a; 个人总结 题目描述 128. 最长连续序…

Java安全篇-Fastjson漏洞

前言知识&#xff1a; 一、json 概念&#xff1a; json全称是JavaScript object notation。即JavaScript对象标记法&#xff0c;使用键值对进行信息的存储。 格式&#xff1a; {"name":"wenda","age":21,} 作用&#xff1a; JSON 可以作为…

网络工程师实验命令(华为数通HCIA)

VRP系统的基本操作 dis version #查看设备版本信息 sys #进入系统视图 system-name R1 #改设备名字为R1进入接口配置IP地址 int g0/0/0 ip address 192.168.1.1 255.255.255.0 #配置接口地址为192.168.1.1/255.255.255.0 ip address 192.168.1.2 24 sub #此…

Apache Hive的基本使用语法(二)

Hive SQL操作 7、修改表 表重命名 alter table score4 rename to score5;修改表属性值 # 修改内外表属性 ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL""TRUE"); # 修改表注释 ALTER TABLE table_name SET TBLPROPERTIES (comment new_commen…

二维双指针,滑动窗口

二维双指针 思路&#xff1a;考虑暴力做法&#xff0c;我们统计前缀和&#xff0c;然后枚举以 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​), ( x 2 , y 2 ) (x_2,y_2) (x2​,y2​)为左上&#xff0c;右下顶点的矩阵有多少是合法的&#xff0c;那么&#xff0c;这样的时间复杂度为 n 4…

【二十七】【算法分析与设计】归并(1),912. 排序数组,归并排序,递归函数的时间复杂度计算,LCR 170. 交易逆序对的总数

912. 排序数组 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 提示&#xff1a; 1 < …

Linux 系统 CentOS7 上搭建 Hadoop HDFS集群详细步骤

集群搭建 整体思路:先在一个节点上安装、配置,然后再克隆出多个节点,修改 IP ,免密,主机名等 提前规划: 需要三个节点,主机名分别命名:node1、node2、node3 在下面对 node1 配置时,先假设 node2 和 node3 是存在的 **注意:**整个搭建过程,除了1和2 步,其他操作都使…

Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models

Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models 相关链接&#xff1a;arxiv 关键字&#xff1a;Vision Language Models、Multi-modality、High-Resolution Visual Tokens、High-Quality Data、VLM-guided Generation 摘要 在这项工作中&#x…

unity学习(76)--窗口化和后台运行

1.通过如下方式将编译的游戏设置为窗口模式。 成功&#xff1a; 2.现在只有鼠标点击的窗体游戏运动&#xff0c;其他窗体游戏都会卡住。 2.1build setting中 2.2unity内部Project Settings 也被同步修改了