linux系统编程3—文件存储函数
文章目录
- 1、innode
- 2、dentry
- 3、stat函数
- 4、lstat函数
- 5、access函数、chmod函数、truncate函数
- 6、link函数
- 7、unlink函数
- unlink的特征
- unlink的用途
- 8、readlink
- 9、rename函数
- 10、隐式回收
1、innode
其本质为结构体,存储文件的属性信息。如:权限、类型、大小、时间、用户(ls -l查询出来的信息都放在innode里面)、盘块位置(文件内容存储在磁盘上的位置)……innode也叫作文件属性管理结构,大多数的 inode 都存储在磁盘上。
文件名单独存储,存储文件名的地方还会有innode,这个地方叫dentry(目录项)
创建一个文件的硬链接,它们拥有着相同的innode,只是有不同的dentry
删除一个硬链接只是删除引用innode的链接,当删除所有的硬链接后,innode的引用值为0,但并不会删除磁盘上的内容,如果重建innode数据还会恢复
2、dentry
目录项,其本质依然是结构体,重要成员变量有两个{文件名,inode,…},而文件内容(data)保存在磁盘盘块中。
3、stat函数
作用:获取文件信息
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf)参数一:文件名参数二:inode结构体指针(传出参数)
返回值:成功返回0,失败返回-1;
stat结构体内容:
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 */ 最后一次改变该文件状态的时间
};
例子
struct stat sbuf;
int a= stat("./a.c", &sbuf);获取文件大小: sbuf.st_size获取文件类型: sbuf.st_mode获取文件权限: sbuf.st_modeprintf("文件大小 %d",sbuf.st_size);
stat结构体中的st_mode 则定义了下列数种情况:
S_IFMT 0170000 文件类型的位遮罩(掩码),可以与stat结构体中的st_mode与运算S_IFSOCK 0140000 套接字S_IFLNK 0120000 符号连接S_IFREG 0100000 一般文件S_IFBLK 0060000 区块装置S_IFDIR 0040000 目录S_IFCHR 0020000 字符装置S_IFIFO 0010000 先进先出
S_ISUID 04000 文件的(set user-id on execution)位S_ISGID 02000 文件的(set group-id on execution)位S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限S_IWGRP 00020 用户组具可写入权限S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限S_IWOTH 00002 其他用户具可写入权限S_IXOTH 00001 其他用户具可执行权限
上述的文件类型在POSIX中定义了检查这些类型的宏定义:S_ISLNK (st_mode) 判断是否为符号连接S_ISREG (st_mode) 是否为一般文件S_ISDIR (st_mode) 是否为目录S_ISCHR (st_mode) 是否为字符装置文件S_ISBLK (s3e) 是否为先进先出S_ISSOCK (st_mode) 是否为socket若一目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名,在linux中,最典型的就是这个/tmp目录啦。
例如
struct stat sbuf;int a= stat("./a.c", &sbuf);if(S_ISREG(sbuf.st_mode)){ printf("这个是一般文件");}else if(S_ISDIR (sbuf.st_mode)){printf("这个是一个目录");}else if(S_ISLNK (sbuf.st_mode)){printf("这个是一个软链接");}
穿透符号链接:不看链接这个文件而去看链接指的内容
默认stat函数穿透符号链接
而lstat函数不会穿透符号链接
cat会穿透符号链接
ls不会穿透符号链接
4、lstat函数
将上面的stat函数改为lstat函数,其他的不变
5、access函数、chmod函数、truncate函数
- access函数:测试指定文件是否存在/拥有某种权限。
- chmod函数:修改文件访问权限。
- truncate函数:截断文件长度成指定长度。常用来拓展文件大小,代替lseek。
6、link函数
link 函数专门用来创建硬链接的,功能和 ln 命令一样。它主要做两件事:
- 创建一个目录项
- inode 结构体引用计数加 1。
这两步是一个原子操作,要么全部失败,要么全部成功。
#include <unistd.h>
int link(const char *oldpath, const char *newpath);参数: oldpath: 原始文件名newpath: 新的硬链接名
7、unlink函数
删除一个名字(某些情况下删除这个名字所指向的文件)
#include<unistd.h>int unlink(const char* pathname);返回值:调用成功返回0,不成功返回-1.
删除时
- 如果这个名字是指向这个文件的最后一个链接,并且没有进程处于打开这个文件的状态,则删除这个文件,释放这个文件占用的空间。
- 如果这个名字是指向这个文件的最后一个链接,但有某个进程处于打开这个文件的状态,则暂时不删除这个文件,要等到打开这个文件的进程关闭这个文件的文件描述符后才删除这个文件。
- 如果这个名字指向一个符号链接,则删除这个符号链接。
- 如果这个名字指向一个socket、fifo或者一个设备,则这个socket、fifo、设备的名字被删除,当时打开这些socke、fifo、设备的进程仍然可以使用它们。
unlink的特征
清除文件时,如果文件的硬链接数到0了,没有dentry对应,但该文件仍不会马上被释放。要等到所有打开该文件的进程关闭该文件,系统才会挑时间将该文件释放掉。
unlink的用途
运行一个程序时有时需要创建一些临时文件。如果进程运行过程中突然终止了,而临时文件还没来的及删除,那么就会遗留下很多没用的临时文件,unlink提供了解决这个问题的一种方法。创建一个临时文件后一刻调用unlink删除文件。但是进程还是打开该文件的,所以该临时文件内容依旧是能被访问读和写的。但是进程终止后,该文件内容就会被删除。 ·
8、readlink
读取符号链接文件本身的内容,得到链接所指向的文件名。
ssize_t readlink(const char *path,char *buf,size_t bufsiz);成功返回实际读到的字节数,失败返回-1,设置errno为相应值。
也可以在bash上输入,比如readlink t.soft 会显示这个硬链接执行的位置
9、rename函数
重命名一个文件
int rename(const char *oldpath,const char *newpath);
成功:0,失败:-1,设置errno为相应值。
10、隐式回收
当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会被释放。系统的这一特性称之为隐式回收系统资源。·因此在程序中打开了fd但是没有回收,在程序退出后会进行隐式回收。但不能依赖这个特性。
linux系统编程3—文件存储函数相关推荐
- linux系统编程之文件与I/O(六):fcntl 函数与文件锁
2013-05-14 11:26 8290人阅读 评论(2) 收藏 举报 分类: linux系统编程(19) 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.fcntl函数 功能:操纵文 ...
- 【Linux系统编程】文件描述符的复制dup()和dup2()
00. 目录 文章目录 00. 目录 01. 文件描述符复制概述 02. 常用函数 2.1 dup函数 2.2 dup2函数 03. 案例实战 3.1 dup示例 3.2 dup2示例 04. 附录 ...
- Linux系统编程之文件IO
Linux系统编程之文件IO 文件IO第一天 一.标准IO基本概念 1.1c语言函数 (c库函数) 调用实现某一个功能,(API) 1.2系统调用:内核中的程序接口,应用程序和硬件设备之间的中间层 1 ...
- Linux系统编程 37 -makefile2个函数和clean
Linux系统编程 37 -makefile2个函数和clean 学习笔记 一个makefile 就是用一个个规则凑在一起 2个函数 wildcard patsubst wildcard 百搭牌,通配 ...
- 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)
文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...
- Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】
linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...
- linux系统io编程,Linux系统编程(1) —— 文件IO
本文主要对Linux系统中文件I/O的基本操作进行说明. 在Linux系统编程中,对文件进行处理的流程,通常是: 打开文件 读写文件 关闭文件 Linux内核对每一个进程维护一个打开的文件列表, 该文 ...
- LINUX系统编程__文件编程__LINUX库open等函数的应用
open函数 文件描述符是一个非负整数,文件描述符0:标准输入,(键盘输入),文件描述符1:标准输出,文件描述符2:标准错误(可以存放垃圾文件) open函数打开文件,打开失败返回的fd为-1 文件存 ...
- [Linux系统编程]_文件编程(一)
嵌入式之路,贵在日常点滴 ---阿杰在线送代码 目录 一.系统调用 1.1 什么是系统调用 1.2 什么是库函数 1.3 将hello写入到文件1.txt流程 1.4 为什么要有缓冲区(补充) 1.5 ...
最新文章
- 双列集合,往treeMap里添加元素的时候注意的事项
- 5分钟学会如何创建spring boot项目
- 用Python递归做个多层次的文件执行
- CVE-2010-0249 极光
- NIO中Selector分析
- 机器学习SVD【二】
- 如何制作歌单 0202 winform
- 模型优化秘诀:从数据的角度分析,零代码也可以提升精度
- OpenStack 是什么
- 书还没出,已经在chinapub被虐了
- LINUX矩阵键盘简单介绍,矩阵键盘程序流程图详细介绍
- 使用Xcode创建第一个App
- x86 x64 arm64 安装包的区别
- Opencv之Unsharp Mask(USM)锐化
- Parellel TSP
- sinx泰勒展开_高考中怎么用泰勒公式?
- 大神见地:Jeff Dean展望AI的5大趋势!
- 『中级篇』什么是Container(15)
- Win10怎么关闭smartscreen筛选器检测功能?
- iBase4J是Java的分布式系统架构 使用Springboot整合开源框架