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…

IDEA 搭建 Otter 源码 DEBUG 环境

IDEA 搭建 Otter 源码 DEBUG 环境 在适配 ShardingSphere-JDBC 同步 Otter 时,本地搭建 Otter Debug 环境记录。 1.源码编译启动 编译 # 参考官方文档,安装 otter/lib 目录下的依赖。 mvn install:install-file -Dfile/otter/lib/jtester-1.1.8.jar …

汇编开关atapi设备

光盘开关操作。 ;u have some tip to remember in ur heart: ;1 DMA flag0 ;2 Packet command must send 3 times ;3 Slave bit0e0h,not 0a0h or 0.386 Code segment para use16 assume cs:codestart: Main Proc near mov ax,Code mov ds,ax mov es,axmov dx,1f6h mov byte pt…

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…

【SpringCloud微服务实战10】DevOps自动化部署微服务项目(Jenkins+Docker+K8s)

一、什么是 DevOps DevOps 是一种重视软件开发人员(Developer)和运维人员(Operations)之间沟通与协作的文化、运动或实践,目标在于快速交付高质量的软件产品和服务。DevOps 强调自动化流程、持续集成与交付(CI/CD)、以及通过工具链、敏捷方法论和跨职能团队协作来增强软…

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

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

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

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

@rollup/plugin-html 使用及原理介绍

rollup/plugin-html 使用及原理介绍 一款用于自动创建 html 文件并导入 rollup 打包文件进行展示的插件。 安装 npm install rollup/plugin-html -D使用 import html from rollup/plugin-html;module.exports {input: index.js,output: {file: dist.js,},plugins: [html(…

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;从系…

android pdf框架-10,相册浏览

MupdfViewer 这是最后apk,源码在前面的文章已经贴过了本站下载地址,只是不是最新的.可能不少是旧的内容. subsampling-scale-image-view这是一个大图片的分块加载的实现.比较不错的.滑动方面我觉得使用flinger的效果比它要流畅,惯性要好. 也有人把这个作成pdf渲染器.但翻页就…

将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…

配置SSH后 GitHub无法使用了

首先进入这个网页GitHub Status看是否能正常访问 。如果这个网络都不行&#xff0c;那先解决网络问题&#xff0c;国内不让访问Github的。 如果在使用Git克隆仓库时遇到连接问题&#xff0c;先排查 Git配置或网络配置问题。可以使用下面的方法诊断和解决这个问题&#xff1a; …

aidl文件生成Java、C++[android]、C++[ndk]、Rust接口

目录 前言一、Java二、C[android]三、C[ndk]四、Rust接口 前言 在 Android 开发中&#xff0c;AIDL 文件通常会被自动编译&#xff0c;生成对应语言的接口文件。对于应用层 Java 开发者来说&#xff0c;使用 AIDL 和 Binder 封装的接口可以让他们更加专注于应用逻辑&#xff0…

【Kotlin】List、Set、Map简介

1 List Java 的 List、Set、Map 介绍见 → Java容器及其常用方法汇总。 1.1 创建 List 1.1.1 emptyList var list emptyList<String>() // 创建空List 1.1.2 List 构造函数 var list1 List(3) { "abc" } // [abc, abc, abc] var list2 ArrayList<In…

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. 最长连续序…