文件和目录

Unix 所有的文件都对应一个 struct stat,包含了一个文件所有的信息。

#include <sys/stat.h>

struct stat {
mode_t st_mode; // 文件类型和用户访问权限
ino_t st_ino; // inode 号
dev_t st_dev; // 文件系统设备号
dev_t st_rdev; // 特殊文件设备号
nlink_t st_nlink; // 链接(引用)计数,这个指对inode的链接数
uid_t st_uid; // 文件所有者 ID
uff_t st_gid; // 文件组所有者 ID
off_t st_size; // 普通文件的字节数
struct timespec st_atime; // 文件最后访问的时间
struct timespec st_mtime; // 文件最后修改的时间
struct timespec st_ctime; // 文件最后状态改变的时间,对inode操作
blksize_t st_blksize; // 最佳I/O块大小
blkcnt_t st_blocks; // 磁盘分配的块数
};

文件类型

  • 普通文件
  • 目录文件
  • 块特殊文件
  • 字符特殊文件
  • FIFO
  • 套接字
  • 符号链接

可以用 宏 S_ISXXX(mode) 来判断具体的文件类型,或者用 st_mode 与屏蔽字 S_IFMT 进行逻辑“与”运算,宏定义为:

#define S_ISXXX(mode) ((mode) & S_IFMT)) == S_IFXXX

文件访问权限

文件访问权限(用户)是由 S_IXXXX 等来控制的,这里稍微理一下。O_RDWR 这些标志是文件打开读写执行时用的,前缀为O(open),这里S(stat)开头的宏是关于文件的类型和用户文件访问权限的。

S_IRUSR、S_IWUSR、S_IXUSR 分别为用户(所有者)读、写、执行,当三个都满足时可以直接写 S_IRWXU,其他类型用户类似。

联系屏蔽字umask,有三个八进制位,分别代表所有者,组,其他用户。

  • 400 用户读
  • 200 用户写
  • 100 用户执行

其他用户类型类似。在文件模式中创建屏蔽字为 1 的位,文件中mode中的相关位将被关闭。

链接

  • 硬链接
  • 符号链接

每个inode中都有一个链接计数,其值是指向该inode的文件目录项数,同时也包含在结构stat中的st_nlink里。只有当目录项数减为 0 时,才可删除该数据块。这种链接称为硬链接。

符号链接可以理解为是文件数据块的一个指针,删除了文件,符号链接也就失效了。

再看个目录项的链接计数: 一个也目录下的链接计数最后少为2,一个来自命名改目录的目录项,一个是在目录中的.项。

结语

感觉这章的重点就在这些地方了,文件系统这一块我只说了大概,下一篇深入理解下linux的文件系统

APUE 文件和目录的更多相关文章

  1. [APUE]文件和目录(中)

    一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...

  2. [APUE]文件和目录(上)

    一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...

  3. [APUE]文件和目录(下)

    一.mkdir和rmdir函数 #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *pathn ...

  4. APUE ☞ 文件和目录

    粘着位(Sticky Bit) S_ISVTX位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...

  5. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. apue chapter 4 文件和目录

    1.文件信息结构体 struct stat{ mode_t st_mode; //file type and permissions ino_t st_ino; //i-node number (se ...

  7. APUE(4)---文件和目录 (3)

    十三.函数rename和renameat #include <stdio.h> int rename(const char *oldname, const char *newname); ...

  8. APUE(4)---文件和目录 (2)

    七.函数umask umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,这是少数几个没有出错返回函数中的一个.其中cmask是9个常量(S_IR/W/XUSR.S_IR/W/XGRP.S_IR ...

  9. apue学习笔记(第四章 文件和目录)

    本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...

随机推荐

  1. bzoj 2428 均分数据

    题目大意: 已知N个正整数 将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小 求最小均方差 思路: 模拟退火 #include<iostream> #include<c ...

  2. the odb manual

    http://www.codesynthesis.com/products/odb/doc/manual.xhtml#18.4

  3. linux centos7 安装mysql-5.7.17教程(图解)

    1系统约定安装文件下载目录:/data/softwareMysql目录安装位置:/usr/local/mysql数据库保存位置:/data/mysql日志保存位置:/data/log/mysql 2下 ...

  4. table样式测试总结tr td宽度分析

    题外话:一直以来习惯布局用ul,li样式调整比较方便,不会互相影响出现一些问题,but~现在公司涉及很多表格打印,都是用table写的,好多宽度高度合并啊,组合啊~~~,单元格之间互相影响,有的样式设 ...

  5. spring 异常处理

    1. 实现接口 HandlerExceptionResolver 捕获异常 2.@ExceptionHandler 在方法添加注解,捕获本地controller异常 3.@ControllerAdvi ...

  6. redis存储对象(转)

    原文地址:http://www.cnblogs.com/JKayFeng/p/5911544.html 为什么要实现序列化接口 当一个类实现了Serializable接口(该接口仅为标记接口,不包含任 ...

  7. 【洛谷4721】【模板】分治FFT(CDQ分治_NTT)

    题目: 洛谷 4721 分析: 我觉得这个 "分治 FFT " 不能算一种特殊的 FFT ,只是 CDQ 分治里套了个用 FFT (或 NTT)计算的过程,二者是并列关系而不是偏正 ...

  8. 406 Queue Reconstruction by Height 根据身高重建队列

    假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列.注意:总人数少于1100人.示 ...

  9. hdu 4104 Discount

    http://acm.hdu.edu.cn/showproblem.php?pid=4104 一开始还以为这题是背包,然后优化下这个背包,但是一直都优化不出来. 然后题解是直接模拟而已,唉 先从小到大 ...

  10. FCC 基础JavaScript 练习4

    1.另一种数据类型是布尔(Boolean).布尔 值要么是true要么是false, 它非常像电路开关, true 是“开”,false是“关”.这两种状态是互斥的 2.伪代码 if(条件为真){ 语 ...