Linux文件操作(二)

news2024/11/15 12:24:03

Linux文件操作(二)

  • 导语
  • 文件和目录维护
    • chmod
    • chown
    • link及其变体
    • dir及其变体
    • chdir和getcwd
  • 扫描目录
    • opendir
    • readdir
    • telldir
    • seekdir
    • closedir
    • 示例程序
  • 错误处理
    • strerror
    • perror
  • /proc
  • fcntl
  • mmap相关
    • mmap
    • msync
    • munmap
  • 总结
  • 参考文献

导语

文件操作的第二部分,介绍文件和目录相关操作,主要是目录,还有一些错误的处理方式

文件和目录维护

chmod

chmod是常用的修改文件的命令(这里是C语言的),用来修改文件和目录的权限,一般用户都可以调用,但是不一定都能成功操作,例如普通用户尝试操作系统文件,可能就会返回-1,函数原型如下

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

path为路径,mode为参数,它使用的参数和open一样

chown

chown供超级用户(管理员)使用,可以改变一个文件的属主

int chown(const char *path, uid_t owner, gid_t group);

给的参数分别是路径,用户id,组id,后两者是需要修改的目标

link及其变体

unlink调用时会删除文件的目录项并减少连接数,成功返回0,否则返回-1,但它操作的是目录项(即操作的其实是内存的目录项而不是外存的文件本身),如果想删除文件,需要当前用户拥有被操作文件的写和执行权限,实际上,当文件的链接数为0且无进程打开文件时,该文件会被自动删除

link调用会创建指向已有文件的新链接,它创建的是一个硬链接,可以认为给源文件加上一个引用

symlink是符号链接,是软链接,可以认为是快捷方式

具体的函数原型如下

int unlink(const char *path);
int link(const char *path1, const char *path2);
int symlink(const char *path1, const char *path2);

dir及其变体

mkdir用于创建一个新目录,函数原型如下

int mkdir(const char *path, mode_t mode);

path是新目录的名字,mode和open的参数一样,并且新目录服从umask的设置

rmdir用于删除目录,函数原型如下

int rmdir(const char *path);

参数就是待删除的目录,但前提是该目录为空,如果需要删除非空目录可以用命令rm -r,它会递归删除指定目录和其下的所有内容,但是这个操作基本不可逆转,如果在主目录里用会是毁灭性的

chdir和getcwd

chdir和shell中的cd很像,用来改变当前的工作目录,当然shell中也有一模一样的命令

getcwd是获取当前的工作目录,它会把当前目录名字写到缓冲区中,如果长度过长则会返回null,成功则返回缓冲区的首地址

两者的函数原型如下

int chdir(const char *path);
char *getcwd(char *buf, size_t size);//size是缓冲区大小

扫描目录

opendir

opendir是打开一个目录并建立一个目录流,成功则返回目录指针否则返回空,目录流通过一个底层文件描述符访问目录本身,文件过多可能会执行失败,即文件描述符耗尽,函数原型如下

DIR *opendir(const char *name);

readdir

readdir返回一个指针,该指针保留目录流中下一个目录项的有关资料,相当于遍历一个存目录项的数组,如果发生错误或者到目录尾,返回空,函数原型如下

struct dirent *readdir(DIR *dirp);

telldir

telldir记录一个目录流的当前位置,表示当前已经读取的目录项索引,可以认为是获得数组下标,原型如下

long int telldir(DIR *dirp);

seekdir

seekdir用来设置目录流的目录项指针,可以认为是数组中修改当前操作变量,原型如下

void seekdir(DIR *dirp, long int loc);

closedir

closedir用于关闭目录流,和opendir是逆操作

int closedir(DIR *dirp);

示例程序

错误处理

获取错误通常是通过errno变量来得到的,书上errno变量的取值部分如下,一般可以通过两个函数来报告出现的错误

在这里插入图片描述

strerror

strerror把错误映射成一个字符串,该字符串负责对发生的 错误类型进行说明,原型如下

char *strerror(int errnum);

perror

perror也是把报告的错误映射成一个字符串,但它的输出对象是stderr,并且它会在输出前先加上检测的对象冒号和空格,原型如下

void perror(const char *s);

/proc

Linux将任何事物都看成文件,即使是硬件设备,它提供了一个文件系统procfs,以proc目录展现,该目录下有许多用于操作驱动和内核的特殊文件,只要有对应的权限,就可以读写这些文件,以下是一个proc目录的例子

在这里插入图片描述

通常情况下,直接读取这些文件就可以获得设备或其他的状态信息,例如读取cpu的信息如下,每次读取这些文件的内容时,它们会及时更新,

在这里插入图片描述

/proc目录中的文件是可修改的,但是只有root权限才能修改,除此之外,还可以通过查看proc目录查看当前运行进程的细节,下面是一个查看bash的例子

在这里插入图片描述

fcntl

fcntl用于对打开的文件描述符执行操作,以下是书上给出的参数介绍

在这里插入图片描述

fcntl函数原型如下

in fcntl(int fildes, int cmd);
int fcntl(int fildes, int cmd ,long arg);

mmap相关

mmap

mmap用来实现一块可以被共用的内存,该部分内存可以被多个程序读写,mmap创建指向内存区域的指针,该区域可以与一个打开的文件描述符的内容相关联,函数原型如下

void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);

参数的意思分别是,申请的内存首地址,申请长度,访问权限,程序对内存段改变的影响,文件描述符,起始偏移值

参数的取值范围如下

在这里插入图片描述

flag:

在这里插入图片描述

msync

与mmap相关联的还有msync函数,它将内存段中的修改写回被映射的文件中,函数原型和flag的参数如下

int maync(void *addr, size_t len, int flags);

在这里插入图片描述

munmap

munmap是释放内存段,函数原型如下

int mumap(void *addr, size_t len);

总结

Linux对于文件和目录的操作非常多样化,并且大多是借助shell和C语言来实现的,相较于windows更简单一些

参考文献

  1. 《Linux程序设计(第4版)》

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

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

相关文章

juzige/Monitoring-System-基于Java语言的光伏监控系统

Photovoltaic-Monitoring-System-Based-on-Java-Language 基于Java语言的光伏监控系统光伏发电系统光伏软件系统光伏监控系统源码光伏发电系统源码-智电云 一、 介绍 光伏光伏发电预测逆变器监控逆变器数据采集光伏运维光伏电站光伏功率预测光伏监控系统光伏发电系统光伏软件…

【CSS in Depth 2 精译_022】3.6 一招搞定容器内元素间距的问题 + 3.7 本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

jQuery入门(六)jQuery实现瀑布流分页案例

一、瀑布流分页案例分析 1.1) 功能分析: 鼠标下拉,加载分页数据(10条) ,如下图: 案例分析: 1.2) 如何确定当前显示的数据已经浏览完毕? 公式:(滚动条距底部的距离 滚动条上下滚动的距离 当…

【Python篇】Python 类和对象:详细讲解(下篇)

文章目录 Python 类和对象:详细讲解(下篇)15. 接口和协议(Interfaces and Protocols)15.1 什么是接口?15.2 协议的基本概念例子:定义飞行协议详细解释输出示例 16. 装饰器模式(Decor…

A02、Java编程性能调优(02)

1、Stream如何提高遍历集合效率 1.1、什么是Stream 现在很多大数据量系统中都存在分表分库的情况。例如,电商系统中的订单表,常常使用用户 ID 的 Hash 值来实现分表分库,这样是为了减少单个表的数据量,优化用户查询订单的速度。 …

ZYNQ-Utlscale-RFSOC看门狗

ZYNQ-Utlscale-RFSOC看门狗复位 ZYNQ-Utlscale-RFSOC 看门狗的程序网上里程很少,开源资料也是几乎没有,最近需要用到这个功能,来来回回搞了一周才搞定。刚开始参考ZYNQ7000的资源,发现MPSOC不适用。很感谢下面的几篇文章&#xf…

探索TinyDB:轻量级数据库的优雅之旅

文章目录 探索TinyDB:轻量级数据库的优雅之旅背景:为何选择TinyDB?TinyDB是什么?如何安装TinyDB?简单库函数使用方法场景应用常见Bug及解决方案总结 探索TinyDB:轻量级数据库的优雅之旅 背景:为…

【电子通识】电子元器件可靠性基本概念

什么是电子元器件 电子元器件是电子产品的基本组成单元, 是电子元件和电子器件的总称。 通常电子元件指的是无源元件, 电子器件指的是有源器件。无源元件是对所供给的电能执行被动操作(如耗散、储蓄或释放等)的元件, 如…

《普通人学AI指南PDF》免费下载破10万。。。

你好,我是郭震 普通人如何开始AI,用好AI? 我在今年制作的《普通人学AI指南》PDF,从中或许能帮你找到答案: 1 PDF背景介绍 此PDF我是今年开始着手制作,到6月8日终版,中间历经反复多次修改&#x…

LabVIEW布尔值比较与信号状态上升沿下降沿检测

在 LabVIEW 编程中,布尔值的比较不仅是逻辑运算的重要组成部分,还广泛应用于信号的上升沿和下降沿检测。通过理解 True > False 这样的基本表达式,以及如何在程序中检测信号的状态变化,开发者可以有效地控制系统行为&#xff0…

内存管理篇-17解开页表的神秘面纱-上

--好像并没有解开。。 1.遗留的一些问题 (1)页表存储在内存的什么地方?页表服用的对象就是MMU,主要就为了MMU单元翻译的时候提供作用,因此能存放在MMU中的TLB缓存中,也可能存放在内存中。但是在内存中的什…

【MATLAB】matlab生成的图像如何导出(三种方法教会你)

我们经常使用matlab生成各类的图,如何将其导出,导出为何种类型。 方法一:选择 matlab 生成的图形界面 " Figure 1 " 的菜单栏 " 编辑 " — " 复制图窗 " , 就可以将图像拷贝到 Word 文档中 打开 Word 文档 ,…

远程调用以及注册中心Nacos

小编目前大一,刚开始着手学习微服务的相关知识,小编会把它们整理成知识点发布出来。我认为同为初学者,我把我对知识点的理解以这种代码加观点的方式分享出来不仅加深了我的理解,或许在某个时候对你也有所帮助,同时也欢…

YOLOv5课堂行为识别系统+GUI界面

课堂行为检测 gui/课堂行为识别系统/YOLOv5课堂行为识别/ yolov5/opencv/计算机视觉/python程序/深度学习/pytorch 数据集标注/配置好环境程序可直接运行/带UI界面/代码数据集/代码数据集 [功能]图片识别/视频识别/摄像头识别 损失/准确率等数据可在ten…

Golang 教程3——包

Golang 教程3——包 注意,该文档只适合有编程基础的同学,这里的go教程只给出有区别的知识点 文件结构 前置工作 在文件testproject01目录下执行 ‘go mod init gocode/testproject01’ (base) PS E:\Goproject\src\gocode\testproject01> go mo…

Linux学习——Ubuntu上QT添加资源

在我们平时的车载控制屏幕上一般不会只有文字和黑白的按钮,为了美观和容易操作,在设计的时候一般会添加图片或者是图标,来让界面的人机交互达到最好,那么我们今天就来学习一下如何在QT中添加资源图片! 1.传输照片&…

easy_fastapi Python 后端开发框架

GitHub easy_fastapi by one-ccs 遵循 MIT 开源协议 Easy FastAPI 基于 FastAPI 开发的后端框架,集成了 SQLAlchemy、Pydantic、Alembic、PyJWT、PyYAML、Redis 等插件,旨在提供一个高效、易用的后端开发环境。该框架通过清晰的目录结构和模块化设计&am…

GNU/Linux - Linux kernel memory access

User space memory access from the Linux kernel An introduction to Linux memory and user space APIs By M. Jones 10 August 2010 Archive date: 2023-08-31 虽然字节可能是 Linux 中内存的最低可寻址单位,但页面才是内存的可管理抽象。本文首先讨论 Linux …

cuda,torch,paddle向下兼容

1、第一次配置yolov9模型时,使用的cuda的版本是11.6,torch和torchvision都是对应版本的 使用的tensorrt版本8.6,可以正常跑yolov9 其它不动,直接将cuda版本换为cuda11.7,依然可以正常运行 2、paddleseg paddle同样安…

3.1 线性结构

令序列X、Y、Z的每个元素按顺序进栈,且每个元素进栈.出栈各一次,则不可能得到出栈序列( )。 A. XYZ B. XZY C. ZXY D. YZX 正确答案是 C。 解析 ZXY不可能得到这个序列,因为当Z最先出栈,说明X、Y已经入栈&a…