文件和目录

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. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

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

  5. apue chapter 4 文件和目录

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

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

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

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

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

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

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

  9. [04]APUE:文件与目录

    [a] stat / lstat / fstat #include <sys/stat.h> int stat(const char *restrict pathname, struct ...

随机推荐

  1. php获取当前方法名和类名

    php提供的一些系统常量可以完成这些 php获取当前方法名(函数名) __FUNCTION__ php获取当前类名 __CLASS__ 或者 get_class($this); php获取本类所有的方 ...

  2. ipython and bpython

    ipython: 1.安装easy_install工具 wget http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py 2 ...

  3. IOS学习笔记1`

    写了IOS的Hello World,记事本写的.除了一些基本的语法外,最主要的收获就是路径问题了. 直接把文件拖入终端,就会显示文件的完全限定名了.

  4. oracle从各个表取得数据保存到另一个表

    从各个表中取得数据保存另一个表中: CREATE VIEW PARAMETER_view ASWITH tall AS ( SELECT p.PI_NO,--产品序列号 p.SERIALNO,--产品 ...

  5. python学习笔记 python实现k-means聚类

    # -*- coding: utf-8 -*- """ Created on Thu Mar 16 14:52:58 2017 @author: Jarvis " ...

  6. Android快速实现上传项目到Github

    本文为skylinelin原创,转载请注明出处! 一.简介 现在在网上浏览关于Git的文章,基本上都是使用命令行(Git Bash),命令行效率是很高的,但是有一定的复杂性,现在我们看如何用AS来讲项 ...

  7. 基于ITextSharp插件在ASP.NET MVC中将图表导出为PDF

    样本: 在这个示例中,我们使用的是微软给我们提供的数据库,也就是家喻户晓的Northwind数据库.要下载Microsoft的免费样本Northwind数据库,您需要访问以下URL.下载Northwi ...

  8. java8_api_stream

    与集合联系紧密 Stream-1    stream概念    特点    使用示例

  9. [leetcode]236. Lowest Common Ancestor of a Binary Tree 二叉树最低公共父节点

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...

  10. Oracle登录命令

    1.运行SQLPLUS工具 C:\Users\wd-pc>sqlplus 2.直接进入SQLPLUS命令提示符 C:\Users\wd-pc>sqlplus /nolog 3.以OS身份连 ...