linux 系统编程—文件/文件系统

Linux高级编程基础——文件系统编程之递归遍历/home目录 文件系统编程之递归遍历/home目录 /编写程序完成以下功能: 1.递归遍历/home目录,打印出所有文件和子目录名称及节点号。 2.判断文件类型,如果是子目录,继续进行递归遍历,直到遍历完所有子目录为止。/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl... 阅读详情

linux 系统编程—文件/文件系统

优先使用库函数
摘自黑马程序员配套视频

命令

strace

查看程序使用的系统调用

文件操作

open

int open(char *pathname, int flags)
作用:
		打开文件
参数:
		pathname:	文件的路径
		flags: 文件的打开的方式

返回值:
		成功: 打开文件所得到对应的 文件描述符 (整数)
		失败: -1, 设置errno
int open(char *pathname, int flags, mode_t mode)
作用:
		打开文件
参数: 
		pathname: 欲打开文件路径名
		flags: 文件的打开的方式
		mode: 使用的前提为,参数flags指定了O_CREAT 8进制,用来描述文件的访问权限(rwx)
				创建文件的最终的权限为 mode & ~umask
返回值:
		成功: 打开文件所得到对应的 文件描述符 (整数)
		失败: -1, 设置errno

close

int close(int fd)
作用:
		关闭文件

read

ssize_t read(int fd, void *buff, size_t count)

参数:
		fd: 文件描述符
		buf: 存数据的缓冲区
		count: 缓冲区的大小
		
返回值:
		0: 读到了文件的末尾
		成功: 读到的字节数
		失败: -1, 设置errno
		-1: , 并且errno = EAGAIN 或 EWOULDBLOCK, 说明不是read失败, 而是read在以非阻塞方式读一个设备文件(网络文件), 并且文件无数据
		
注: 
		无用户级缓冲

write

ssize_t write(int fd, const void *buff, size_t count)

参数:
		fd: 文件描述符
		buf: 待写出数据的缓冲区
		count: 写出的内容的大小
		
返回值:
		成功: 读到的字节数
		失败: -1, 设置errno
		
注: 
		无用户级缓冲

文件描述符

0 - STDIN_FILENO				标准输入
1 - STDOUT_FILENO				标准输出
2 - STDERR_FILENO				标准错误

fcntl

int fcntl(int fd, int cmd, ... /* arg */ );
功能描述:根据文件描述词来操作文件的特性。

获取文件状态: F_GETFL
设置文件状态: F_SETFL

strerror

char *strerror(int errnum)
参数:
		errnum: 错误号,通常是 errno
返回值:
		一个指向错误字符串的指针,该错误字符串描述了错误 errnum

perror

void perror(const char *str)
参数:
		str: 这是 C 字符串,包含了一个自定义消息,将显示在原本的错误消息之前。

lseek

off_t lseek(int fd, off_t offset, int whence);
参数:
		fd: 文件描述符
		offset: 文件偏移量
		whence: 起始偏移位置 SEEK_SET / SEEK_CUR / SEEK_END
返回值:
		成功: 较起始位置的偏移量
		失败: -1, 设置errno
注: 文件的读和写使用的同一个偏移位置

拓展:
		可以使用lseek来获取拓展文件的大小

stat

描述:
		获取文件的属性

int stat(const char *path, struct stat *buf);
参数:
		path: 文件路径
		buf: 传出参数, 存放文件的属性
返回值:
		0: 成功
		-1: 失败, 设置errno
注:
		有stat穿透现象,即不能查看符号连接类型, 若要查看符号链接类型, 则需要用lsate

stat 结构体的内容

包含在 sys/stat.h 的头文件中

struct stat {
               dev_t     st_dev;     /* ID of device containing file */
               ino_t     st_ino;     /* inode number */
               mode_t    st_mode;    /* protection */
               nlink_t   st_nlink;   /* number of hard links */
               uid_t     st_uid;     /* user ID of owner */
               gid_t     st_gid;     /* group ID of owner */
               dev_t     st_rdev;    /* device ID (if special file) */
               off_t     st_size;    /* total size, in bytes */
               blksize_t st_blksize; /* blocksize for file system I/O */
               blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
               time_t    st_atime;   /* time of last access */
               time_t    st_mtime;   /* time of last modification */
               time_t    st_ctime;   /* time of last status change */
           };

可以通过 st_mode 来调用宏函数来做更多的操作

S_ISREG(m)  is it a regular file?
S_ISDIR(m)  directory?
S_ISCHR(m)  character device?
S_ISBLK(m)  block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)
S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)

lstat

int stat(const char *path, struct stat *buf);
与 state 用法完全一样
区别:
		穿透符号链接: stat: 会, lstat: 不会

link

int link(const char *oldpath, const char *newpath);
参数:
		oldpath: 旧文件的路径
		newpath: 新的文件的路径
返回值:
		0: 成功
		-1: 失败

unlink

int unlink(const char *pathname);
		参数: 被删除文件的路径

当被unlink以后,文件具备了被删除的条件, 当文件没有被其他的进程使用的时候, 系统会将其删除

readlink

读取符号链接文件本身的内容, 得到链接所指向的文件名
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
参数:
		pathname: 待读取的文件的路径
		buf: 文件缓冲区
		bufsiz: 读取的文件的大小
返回值:
		成功: 读到的字节数
		失败: -1, 设置 errno

rename

int rename(const char *oldpath, const char *newpath);
参数:
		oldpath: 旧文件的路径
		newpath: 新的文件的路径

目录操作

getcwd

char *getcwd(char *buf, size_t size);
参数:
		buf: 读取出来的字符串的存放的位置
		size: 缓冲区的大小
返回值:
		当前目录所在的位置, 和 buf 的内容一致

chdir

int chdir(const char *path);
参数:
		path: 前往的文件夹的路径
返回值:
		成功: 0
		失败: -1, 设置 errno

opendir

DIR *opendir(const char *name);
参数:
		name: 文件夹的名字, 可以是相对路径, 也可以是绝对路径
返回值:
		成功: 指向该目录结构体的指针
		失败: NULL

closedir

int closedir(DIR *dirp);
参数:
		dirp: 指向目标目录结构体的指针
返回值:
		成功: 0
		失败: -1, 设置errno

readdir

struct dirent *readdir(DIR *dirp);
参数:
		dirp: 指向目标目录结构体的指针
返回值:
		成功: 返回目录项
		失败: NULL, 设置 errno

dirent结构体的内容

struct dirent {
               ino_t          d_ino;       /* Inode number */
               off_t          d_off;       /* Not an offset; see below */
               unsigned short d_reclen;    /* Length of this record */
               unsigned char  d_type;      /* Type of file; not supported
                                              by all filesystem types */
               char           d_name[256]; /* Null-terminated filename */
           };

dup和dup2

int dup(int oldfd)
参数:
		oldfd: 已有的文件的描述符
返回值:
		成功: 新的文件描述符
		失败: -1, 设置errno
作用:
		添加一个文件描述符的拷贝, 两个文件操作符指向同一个文件
int dup2(int oldfd, int newfd);
参数:
		oldfd: 已有的文件描述符
		newfd: 新的文件描述符
返回值:
		成功: 新的文件描述符
		失败: -1, 设置errno
作用:
		可以指定文件描述符的拷贝

应用

重定向文件输出, 可以讲输出到屏幕上的内容输出到文件中
将 1 修改

fcntl函数实现dup

int fcntl(int fd, int cmd, ...)
参数:
		cmd: F_DUPFD
		参3: 返回由 n 开始的第一个未被占用的最小的文件描述符
Linux/Unix文件系统标签与UUID读取编程实战 本文还有配套的精品资源,点击获取 简介:本文件可能包含了用于Linux和Unix系统的编程项目或工具,其内容聚焦于读取文件系统的标签和UUID。文件系统的标签是可选的标识字符串,而UUID是全球唯一的128位数字,对于自动挂载文件系统至关重要。开发者可以通过系统调用如 statfs() 或使用库如 libuuid 来访问这些信息。本项目可能涉及到... 阅读详情

相关推荐

sdio wifi 移植

介绍 简单来说,sdio起源自sd标准,顾名思义就是sd的IO接口(interface)的意思,更具体的说明,sd本来是记忆卡的标准,但是现在也可以把SD卡拿来插上一些外围设备接口使用,这个就是就叫做sdio。 而且sdio本身是一种相当单纯的技术,通过sd的IO引脚来连接外部外围,并且通过sd的IO数据接位与外围传输数据,而且sd协会也推出很完整的sdio stack 驱动程序,使得sdio外围得开发与应用变得非常热门 这里我们要移植的是RTL8822cs的sdio WiFi 模块,将其移植到rk3

Enosji的博客 9612

opendir()和readdir()函数

1. opendir() 头文件   #include<sys/types.h>   #include<dirent.h> 函数原型   DIR* opendir (const char * path ); (获取path子目录下的所由文件和目录的列表,如果path是个文件则返回值为NULL) 功能   打开一个目录,在失败的时候返回一个空的指针。 错误代码: 1、EACCESS 权限不足。 2、EMFILE 已达到进程可同时打...

modi000的博客 561

Allegro17.2 出gerber文件详细流程 - 干货

Allegro17.2 出gerber文件详细流程 - 干货

u010614434的博客 1万+

Linux系统编程—文件

1. 文件描述符 文件描述符就是一个非负整数,用于充当文件句柄,以表示一个打开的文件。 标准文件描述符 标准输入(0):STDIN_FILENO 标准输出(1):STDOUT_FILENO 标准错误(2):STDERR_FILENO 2. 文件操作 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int

gaoZhuanMing的博客 379

微电网系列: 位移因数DPF&&功率因数PF&&过激&&欠激

文中对比了位移因数(DPF,仅基波相位)与功率因数(PF,含谐波影响)的差异,指出PF=DPF×DF(畸变因数)。过激/欠激状态对应无功功率控制:过激(容性,电流超前,抬升电压)与欠激(感性,电流滞后,抑制电压)。PCS(如光伏逆变器)需逆向调节电网无功状态,过激时发出容性无功,欠激时吸收感性无功,以维持电压。

云纳星辰怀自在 1174

Windows 11 的C盘User(用户)文件夹下的用户文件夹名称的修改

背景介绍:由于系统重装导致Windows 11的系统用户名与C盘User(用户)文件夹下的用户名文件夹(公用文件夹旁边的文件夹)出现名称不一致,事例中系统用户名命名为“寂萧”,User(用户)文件夹下的文件夹名称却是“77555”。【QQ邮箱前五位真的真的看着很别扭】注:改名有风险,三思而后行。User(用户)文件夹下的用户名是中文在某些软件的应用场景下产生不便,导致很多软件莫名其妙报错,甚至无法使用,笔者不建议修改为中文名。//和笔者一样的强迫症除外//

2302_79084172的博客 10万+

Linux 文件系统与 I/O 编程核心原理及实践笔记

本文深入探讨了文件系统的概念与操作机制。从狭义角度分析,文件存储在磁盘上,由文件系统通过inode和block结构管理;广义上,Linux将硬件设备、进程信息等抽象为文件(如/proc、/sys),统一使用文件接口访问。文章详细讲解了文件元数据和内容操作的区别,揭示了进程通过文件描述符与内核交互的底层原理,并对比了系统调用和库函数的关系。最后通过实例演示了文件权限位掩码、系统调用接口的使用方法,以及文件描述符在进程中的管理机制。

2301_80541270的博客 2438

针对so层不固定位置的动态加密,怎么解决?(面试题)

Android逆向之破解某应用加密算法(动态调试so和hook so代码):so 代码动态解密后才执行,我们可以在解密完成后获取解密后的代码或数据。Android逆向之旅—动态方式破解apk进阶篇(IDA调试so源码)如果你有更具体的加密场景,欢迎提供更多信息,我可以给出更详细的方案!某些 so 在运行时生成密钥,解密后再用。某APP密码加密算法分析。

SXXYNHHXX的博客 927

文件I/O(标准IO、系统IO、文件描述符、重定向、ext2文件系统)——Linux系统编程

文章目录基础IOC语言中的文件操作fopen(打开文件)fread(从文件流读取数据)fwrite(将数据写至文件流)fseek(移动文件流的读写位置)fclose(关闭文件)系统调用的文件操作open(打开文件)write(将数据写入以打开的文件)read(由已打开的文件读取数据)lseek(移动文件的读写位置)close(关闭文件)库函数和系统调用接口系统调用库函数文件描述符重定向命令操作的重定向dup2和dupdup2(复制文件描述符)dup(复制文件描述符) 基础IO C语言中的文件操作 fopen

YOLO的博客 2415

【vivado PG学习】1 PG168:7 Series FPGAs Transceivers官方配置方法学习笔记

介绍: The 7 series FPGAs Transceivers Wizard LogiCORE™ IP 自动创建配置7系列fpga 收发器的HDL封装。向导可以配置一个或多个支持行业主流标准的高速串行收发器。或者从零开始支持各种自定义协议。 功能: 创建配置7系列fpga 收发器的HDL封装。 自动对模拟设置进行配置。 预定义了提供Aurora 8B/10B, Aurora 64B/66B, CEI-6G,DisplayPort, Interlaken, Open Base StationAr..

w0shishabi的博客 5万+

vasp计算练习1-Si

si的vasp训练流程

qq_41074165的博客 3301

Unix/Linux编程:/proc文件系统

类似于其他的几种Unix实现,Linux也提供了/proc文件系统,由一组目录和文件组成,挂载(mount)在/proc目录下 /proc文件系统是一种虚拟文件系统,以文件系统目录和文件组成,提供一个指向内核数据结构的接口。这为查看和改变系统属性开启了方便之门。 另外,还能通过一组以/proc/PID形式命名的目录(PID 即进程 ID)查看系统中运行各进程的相关信息 通常,/proc 目录下的文件内容都采取人类可读的文本形式,shell 脚本也能对其进行解析。程序可以打开、读取和写入/proc 目录下

OceanStar的博客 1109

acados安装与调试指南:版本兼容性问题

在计算机编程领域,软件工具和库的安装与调试是每个开发者必经的挑战。最近,在安装和使用acados库时,我遇到了一个有趣的问题,这里我将详细分享我的经验和解决方案。

m0_62153576的博客 740

Unix/Linux编程:文件系统

文件系统是对常规文件和目录的组织集合。用于创建文件系统的命令是 mkfs。 Linux 的强项之一便是支持种类繁多的文件系统,如下所示。 传统的 ext2 文件系统。 各种原生(native)UNIX 文件系统,比如,Minix、System V 以及 BSD 文件系统 微软的 FAT、FAT32 以及 NTFS 文件系统 ISO 9660 CD-ROM 文件系统。 Apple Macintosh 的 HFS 一系列网络文件系统,包括广为使用的 SUN NFS(Linux 对 NFS 的实现信息请参见 h

OceanStar的博客 438

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Unix/Linux编程:多个文件系统

一个Unix系统有两个磁盘或者分区将会如何?现在已经知道,用一些简单的抽象能够将一个单一的分区组织成一颗目录树。但是如果有两个分区,需要两颗独立的树吗? 其他的系统又是如何怎么做的呢?有些操作系统将盘符分配给每个磁盘或者分区,并将字母或者名字作为一个文件全路径的一部分。另一种做法是,有些系统统一给所有的磁盘分配块的编号以创建一个虚拟的单一磁盘。 Unix使用第三种方法。每个分区有自己的文件系统树。当计算机上有多于一个的文件系统时,Unix提供一种方法将这些属整合成一颗更大的树: 也就是说用户看到的是一颗完

OceanStar的博客 797

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Linux系统编程】| 【09】/proc文件系统

1.1 获取与进程有关的信息 1.2 /proc目录下的系统信息 1.3 访问/proc文件 2、系统标识

weixin_45926547的博客 2641

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Unix/Linux编程实践】文件系统:编写pwd

知识点目录是一个包含文件名与i-节点对的列表的文件。”文件在目录中“的含义:目录中存放的只是文件在i-节点表的入口,而文件的内容则存储在数据区中。例如,“文件x在目录a中”意味着在目录a中有一个指向文件x的i-节点的链接,这个链接所附加的文件名为x。pwd:用来显示到达当前目录的路径。pwd的工作过程 得到“.”(当前目录)的i-节点号,称其为n(使用stat); chdir .. (使用chdir

jiange_zh的博客 961

【Linux系统编程】文件系统--文件存储/软硬链接/inode/dentry

在当今的计算机世界中,文件系统是操作系统中至关重要的一部分,它负责管理数据的存储和访问。尤其是在Linux系统中,,还影响了系统的性能和安全性。了解Linux文件系统的结构和工作原理,可以帮助我们更有效地管理文件、优化系统性能,并解决潜在的问题。接下来,我们将深入探讨Linux文件系统的基本概念、常见类型以及它们的特点。

Stark的博客 1248

Unix/Linux编程:Unix文件系统回顾

基本定义 从用户的观点来看,Unix定义一个文件包含一个字节序列。理论上,Unix文件可以任意长;在实际中,一个文件的长度是收到物理存储设备空间限制的。Unix文件可以动态的增长,文件系统不能对文件大小进行预定义或者对文件的空间进行预分配。而且,只要应用程序向文件中写入任何数据,文件都会自动增长。 从概念上来说,Unix从零开始对文件中的字节进行计数。在任何时候,文件的大小(size)都被定义成它所包含的字节数。Unix文件系统允许用字节数作为基准对文件进行随机存取,它允许应用程序移到文件中的任何位置并对该

OceanStar的博客 911

Unix/Linux C++应用开发-文件系统编程

Linux系统本身设计类Unix而来,系统由C语言设计实现。同样Linux也支持丰富的底层系统调用库提供给应用程序的文件操作处理。事实上C++语言自身许多类库的方法的封装,内部基本都采用封装系统调用提供统一简洁便利的接口方式。对于Linux系统,针对文件操作除了提供系统方法操作以外,C语言也提供了标准文件操作库,而C++语言由于基于C语言发展而来,因此C++文件编程除了本身提供的标准文件库以外,也

布衣之旅 7662

linux /proc文件系统编程实例

/*  *proc ipsec test  */ #include #include #include #include #include #include #include #define  IPSEC_CONNTRACK "ipsec_conntrack" MODULE_AUTHOR("Qxl"); MODULE_DESCRIPTION("Proc

1106

《Unix/Linux编程实践教程》chapter4 文件系统

chapter4文件系统 章节知识总结 一个磁盘可以被划分成分区,每个分区都可以被看做是一个独立的磁盘。 一个硬盘由一些磁性盘片组成,每个盘片的表面都被划分为很多同心圆,这些同心圆称作磁道,每个磁道又进一步被划分成扇区.扇区是磁盘上的基本存储单元,现在的磁盘包含大量的扇区。 磁盘上存储数据的软件给磁盘上每条磁道上的每个块分配了一个序号,文件系统将被编号的磁盘块划分为3部分: 超级块:用来存放文件系统本身的信息(这些信息包括未使用的磁盘块的信息等) i-节点表(inode table):用来存放文件属性 数

qq_39621037的博客 223

Linux编程基础:第5章Linux文件系统与操作 课后习题

《Linux编程基础》黑马程序员/编著清华大学出版社 目录 一、填空题 二、判断题 三、单选题 四、简答题 1、简单说明软链接文件和硬链接文件的区别。 2、已知inode结构体中的共有15个索引项,其中直接索引项12个,间接索引项、二级索引项、三级索引项各一个,另每个索引项的大小为4个字节。假设系统中每个数据块的大小为1kb,计算inode结构体中索引项可索引的数据块总大小。 3、简述文件IO与标准IO的区别。 五、编程题 1、编写程序,使用系统I/O从指定文件中读取数据,并打印到终端.

WHT869706733的博客 8767

走进 C/C++后台开发的第二步:Linux文件系统编程

Linux系统编程一. 文件操作编程1.1 基于文件指针的文件操作1.1.1 Linux的文件1.1.2 文件的创建,打开与关闭1.1.3 读写文件1.1.4 修改文件的权限1.2 目录操作1.2.1:获取改变当前工作目录1.2.2 创建删除目录1.2.3 目录的存储原理1.2.4 目录相关操作1.3 基于文件描述符的文件操作 (重点)1.3.1 文件描述符简介1.3.2 打开、创建和关闭文件1.3.3 读写文件1.3.4 改变文件大小1.3.5 文件映射1.3.6 文件定位1.3.7 获取文件信息1

专注游戏研发 363

Linux内核模块编程/proc 文件系统(转)

Linux内核模块编程/proc 文件系统(转)[@more@]   /proc 文件系统   在Linux中有额外的机制可以为内核和内核模块将信息发送给进程 -- /proc 文件系统。最初设计的目的是允许更方便的对进程信...

csd3176的博客 319

Unix/Linux编程:网络文件系统NFS的概念

远程文件存取和传送 很多早期的网络系统提供了文件传送服务,它允许用户把某文件的一个副本从一台机器移到另一台机器上

OceanStar的博客 667
上一篇: linux 进程与服务
下一篇: linux 进程管理
ghost_him
博客等级 码龄6年 598粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值