文章目录

  • 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 命令一样。它主要做两件事:

  1. 创建一个目录项
  2. 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—文件存储函数相关推荐

  1. linux系统编程之文件与I/O(六):fcntl 函数与文件锁

    2013-05-14 11:26 8290人阅读 评论(2) 收藏 举报  分类: linux系统编程(19)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.fcntl函数 功能:操纵文 ...

  2. 【Linux系统编程】文件描述符的复制dup()和dup2()

    00. 目录 文章目录 00. 目录 01. 文件描述符复制概述 02. 常用函数 2.1 dup函数 2.2 dup2函数 03. 案例实战 3.1 dup示例 3.2 dup2示例 04. 附录 ...

  3. Linux系统编程之文件IO

    Linux系统编程之文件IO 文件IO第一天 一.标准IO基本概念 1.1c语言函数 (c库函数) 调用实现某一个功能,(API) 1.2系统调用:内核中的程序接口,应用程序和硬件设备之间的中间层 1 ...

  4. Linux系统编程 37 -makefile2个函数和clean

    Linux系统编程 37 -makefile2个函数和clean 学习笔记 一个makefile 就是用一个个规则凑在一起 2个函数 wildcard patsubst wildcard 百搭牌,通配 ...

  5. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  6. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  7. linux系统io编程,Linux系统编程(1) —— 文件IO

    本文主要对Linux系统中文件I/O的基本操作进行说明. 在Linux系统编程中,对文件进行处理的流程,通常是: 打开文件 读写文件 关闭文件 Linux内核对每一个进程维护一个打开的文件列表, 该文 ...

  8. LINUX系统编程__文件编程__LINUX库open等函数的应用

    open函数 文件描述符是一个非负整数,文件描述符0:标准输入,(键盘输入),文件描述符1:标准输出,文件描述符2:标准错误(可以存放垃圾文件) open函数打开文件,打开失败返回的fd为-1 文件存 ...

  9. [Linux系统编程]_文件编程(一)

    嵌入式之路,贵在日常点滴 ---阿杰在线送代码 目录 一.系统调用 1.1 什么是系统调用 1.2 什么是库函数 1.3 将hello写入到文件1.txt流程 1.4 为什么要有缓冲区(补充) 1.5 ...

最新文章

  1. 双列集合,往treeMap里添加元素的时候注意的事项
  2. 5分钟学会如何创建spring boot项目
  3. 用Python递归做个多层次的文件执行
  4. CVE-2010-0249 极光
  5. NIO中Selector分析
  6. 机器学习SVD【二】
  7. 如何制作歌单 0202 winform
  8. 模型优化秘诀:从数据的角度分析,零代码也可以提升精度
  9. OpenStack 是什么
  10. 书还没出,已经在chinapub被虐了
  11. LINUX矩阵键盘简单介绍,矩阵键盘程序流程图详细介绍
  12. 使用Xcode创建第一个App
  13. x86 x64 arm64 安装包的区别
  14. Opencv之Unsharp Mask(USM)锐化
  15. Parellel TSP
  16. sinx泰勒展开_高考中怎么用泰勒公式?
  17. 大神见地:Jeff Dean展望AI的5大趋势!
  18. 『中级篇』什么是Container(15)
  19. Win10怎么关闭smartscreen筛选器检测功能?
  20. iBase4J是Java的分布式系统架构 使用Springboot整合开源框架

热门文章

  1. CQRS\ES架构介绍
  2. css5辅助线,苦练 CSS 基本功——图解辅助线的原理和画法
  3. 无显卡本地运行katago围棋程序
  4. 计算机显示没有可以的ip地址,w7电脑提示没有有效ip地址怎么处理
  5. Openzeppelin库第八期:Crowdsale
  6. vrchat合并账号
  7. JAVA面向对象(OOP)-类和对象
  8. ABB 120 六轴机械手臂编程调试(四) 三菱plc控制器配套程序
  9. cl.clcl.news/index.php,公布一些后门网址
  10. 拯救流浪猫 | 「喵先锋」系列数字版权盲盒明日开抢