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.rhkb.cn/news/289306.html

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

相关文章

应急响应实战笔记04Windows实战篇(1)

第1篇:FTP暴力破解 0x00 前言 ​ FTP是一个文件传输协议,用户通过FTP可从客户机程序向远程主机上传或下载文件,常用于网站代码维护、日常源码备份等。如果攻击者通过FTP匿名访问或者弱口令获取FTP权限,可直接上传webshell&#…

ida调试技巧-通过修改zf寄存器的值绕过简单反调试

参考本篇->OllyDbg笔记-对标志寄存器中ZF的理解(逆向方面)_零标志位zf怎么判断-CSDN博客 不想看也没关系,蒟蒻博主概述一下,总之,在机器执行汇编指令时,标志(flag)寄存器中的一个…

大模型新王诞生!Claude 3首次超越GPT4

一觉醒来,大模型世界迎来了“新王登基”! 当地时间周三,聊天机器人竞技场Chatbot Arena更新对战排行榜,Claude 3反超GPT-4,一举摘得“最强王者”桂冠。 这次登顶榜首的是Claude 3系列的超大杯Opus,它以2分…

如何通过idea搭建一个SpringBoot的Web项目(最基础版)

通过idea搭建一个SpringBoot的Web项目 文章目录 通过idea搭建一个SpringBoot的Web项目一、打开idea,找到 create new project二、创建方式三、配置项目依赖四、新建项目模块五、总结 一、打开idea,找到 create new project 方式1 方式2 二、创建方式 新…

elasticsearch 6.8.x 索引别名、动态索引扩展、滚动索引

文章目录 引言索引别名(alias)创建索引别名查询索引别名删除索引别名重命名索引别名 动态索引(index template,动态匹配生成索引)新建索引模板新建索引并插入数据索引sys-log-202402索引sys-log-202403索引sys-log-202…

STM32 | Systick定时器(第四天源码解析)

STM32 | Systick定时器(第四天)STM32 | STM32F407ZE中断、按键、灯(续第三天)1、参考delay_us代码,完成delay_ms的程序 定时器频率换算单位:1GHZ=1000MHZ=1000 000KHZ = 1000 000 000HZ 定时器定时时间:计数个数/f(频率) 或者 (1/f(频率))*计数的个数 500/1MHZ = 500/1…

农田通量计算中的感热通量与潜热通量分析

地表水热通量主要包括感热/显热通量和潜热通量,是陆-气交互以及水-热-碳循环研究的重要变量。其中,潜热通量是地表蒸散发的能量形式,对农业水资源管理、作物水分利用效率等非常关键。由于热红外遥感对地表干湿变化、以及农业干旱响应快速&…

洗地机哪个好?专业对比,帮你选出比较适合的洗地机

随着科技的不断发展,洗地机已经成为了现代生活中不可或缺的清洁工具。然而,市面上涌现出各种各样的洗地机品牌,品质良莠不齐。因此,选择一个可靠的品牌至关重要,以确保产品质量和使用效果。为了帮助大家更好地选择&…

vulnhub靶场之driftingblues-3

一.环境搭建 1.靶场描述 get flags difficulty: easy about vm: tested and exported from virtualbox. dhcp and nested vtx/amdv enabled. you can contact me by email for troubleshooting or questions. This works better with VirtualBox rather than VMware 2.靶场…

python的一些知识点

在C C Java中,基本数据类型变量(将常量数据存储在变量空间当中) int a 3; int b 4; 在C C中,指针变量(存储的是变量的物理内存地址) int a 3; int* b; b &a; int** c; c &b; printf("%d&…

JAVA面试大全之并发篇

目录 1、并发基础 1.1、多线程的出现是要解决什么问题的? 本质什么? 1.2、Java是怎么解决并发问题的? 1.3、线程安全有哪些实现思路? 1.4、如何理解并发和并行的区别? 1.5、线程有哪几种状态? 分别说明从一种状态到另一种状态转变有哪些方式? 1.6、通常线程有哪几…

Web开发基本流程

Web是全球广域网,能够通过浏览器访问的网站。我们要访问网站,首先要在浏览器输入对应的域名。 浏览器也是一个程序,京东的网站也是一个程序,在京东那边电脑运行着,我们只是通过浏览器远程访问。京东的程序由三个部分组…

【生活】如何学习理财

文章目录 1. 了解基本财务知识2. 制定预算4321理财法则 3. 学习投资知识股票债券基金外汇房地产 4. 了解保险知识人身保险人寿保险健康保险意外伤害保险 财产保险财产损失保险责任保险信用保险 5. 寻求专业建议6. 持续学习和实践参考 首先我们想文心一言提问:如何学…

自媒体用ChatGPT批量洗稿软件V5.9环境配置/软件设置教程【汇总】

大家好,我是淘小白~ 首先,感谢大家的支持~~ ChatGPT采集洗稿软件V5.9版本更新,此次版本更新修改增加了一些内容: 1、自定义多条指令,软件自动判断指令条数,进行输入 2、增加谷歌浏览多账号轮询&#xf…

教育建筑智慧能源管理平台解决方案【新型电力系统下的绿色校园能源管理平台】

一、行业特点 1.建筑类型多:集教学、科研、生活于一体,占地面积大,建筑类型多,功能划分复杂。 2.供电可靠性要求高:教育建筑中的高层建筑、图书馆、实验楼等特级和一级负荷比较多,一旦发生故障会危及生命…

基于Python实现多功能翻译助手(下)

为了将上述步骤中的功能增强与扩展具体化为代码,我们将实现翻译历史记录功能、翻译选项配置以及UI的改进。 翻译历史记录功能 import json # 假设有一个用于存储历史记录的json文件 HISTORY_FILE translation_history.json # 初始化历史记录列表 translati…

Vue3+Element Plus+TS开发企业管理后台(一)

系列文章,讲述一个企业管理后台的前后端设计,持续集成常见的页面功能和服务端设计思路。 效果展示 支持多种布局、主题配色随意切换 侧边菜单背景设置 主题色调切换 移动端完美适配 菜单侧边收起,适合移动端小空间场景。 功能开发计划 #merm…

VTK9.2.0+Qt5.14.0 绘制点云

背景 为了显示结构光重建后的点云,开发QT5.14.0VTK9.2.0的上位机软件,用于对结构光3D相机进行控制,并接收传输回来的3D数据,显示在窗口中。 配置QT和VTK VTK9.2.0下载源码,用Cmake编译,编译好的VTK9.2.0…

Markdown 编辑器使用

CSDN 在博客开头加上 [TOC](你的目录标题)就可以根据博客内容自动生成如下所示的目录: 你的目录标题 Markdown 编辑器功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表无序列表…

JavaScript基础练习题之求斐波那契数列第N项的值

一、什么是斐波那契数列: 斐波那契数列是一个数列,从0和1开始,后面的每一项都是前两项的和。也就是说,斐波那契数列的第n项是前两项的和,可以表示为F(n) F(n-1) F(n-2),其中F(0) 0,F(1) 1。…