apue 第四章

文件和目录这章,主要是围绕着一个结构体state展开的,

我们先看一下这个结构里里面有什么内容

struct stat  
{  
  
    dev_t       st_dev;     /* ID of device containing file -文件所在设备的ID*/  
  
    ino_t       st_ino;     /* inode number -inode节点号*/  
  
    mode_t      st_mode;    /* file type &mode[permission]*/  
  
    nlink_t     st_nlink;   /* number of hard links -链向此文件的连接数(硬连接)*/  
  
    uid_t       st_uid;     /* user ID of owner -user id*/  
  
    gid_t       st_gid;     /* group ID of owner - group id*/  
  
    dev_t       st_rdev;    /* device ID (if special file) -设备号,针对设备文件*/  
  
    off_t       st_size;    /* total size, in bytes -文件大小,字节为单位*/  
  
    blksize_t   st_blksize; /* blocksize for filesystem I/O -系统块的大小*/  
  
    blkcnt_t    st_blocks;  /* number of 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 - i结点状态修改时间*/  
  
};  


从st_mode 开始说

1.文件的类型

     类型很容易,众所周知UNIX的7中文件类型,经常用ls一定非常熟悉了,下面还是列举一下

     1)普通文件 (regular fille)   -

     2)  目录文件   (directory file) d

     3)块特殊设备 (block special file)b

     4) 字符特殊设备 (character special file) c

     5) FIFO  有时候也成为命名管道 named pipe

     6) 套接字 (socket) s

     7) 符号链接  (symbolic link) l

      我们可以用宏 S_ISXXX(),来判断文件的类型,当然在此之前需要获得stat结构, state fstat lstat函数比较简单就不介绍了。

2.文件的访问权限

    我们在ls -al 命令经常会看到这样的显示

     drwxr-xr-x  15 root    root        4100  9月  7 21:35 ./

     rwxr-xr-x 表示了 所有者、组、其他人的权限

      我么经常回使用chmod来改变访问权限,对于目录的访问权限由必要提一下,r表示对改目录有读的权限,即列出改目录下的文件列表,把目录想成一个文本文档其中的内容就是文件列表,这就很好理解,当然内部实现也差不多是这样。r 权限就明白就很清楚。然而对目录文件进行删除重命名等操作必须有wx权限,而且只有内核能够修改文件表,x权限是指当我的路径中存在该目录,/a/b/c/d/a.out 这样对于abcd 目录来说都需要x权限。

3.其他的位

   1.S_ISUID

   2.S_ISGID

   3. S_ISVTX 粘住位 (如果对一个文件设置了粘住位,只有root或者所有者可以删除)

——————————————————

实际用户id         (实际ID标示我们究竟是谁,access函数用来检查实际ID)

 实际组 id

------------------------------------------------------

有效用户id

有效组id              (决定文件访问权限)

附加组id

-------------------------------------------------------

保存设置用户id

保存设置组id      (有效ID的副本,8.1介绍)

———————————————————


 

当用户执行一个程序时,进程的有效用户ID通常是实际用户ID,有效用户ID是实际用户ID, 

如果设置st_uid,有效用户ID变成了这个程序文件所以者的ID,那么我们便可以通过这个程序获得所有者的权限,比如所有者是root.

一个例子就是:passwd命令。   我们用普通用户执行passwd命令,这个命令的所有者是root,而且设置了st_uid,那么执行这个程序我们便有了root权限,

可以对/etc/shadow文件写入操作。我们看一下shadow文件的权限。很神奇有木有,所以st_uid位设置需要非常谨慎。

同理:st_uid也类似。

S_ISUID,S_ISGID是一个常量用作检查st_uid和st_gid是否被设置,取自chmod中的mode常量


 

当创建新文件时,我们会设定文件的访问权限,最终的访问权限会和一个值进行&操作后得出最终的权限值。

这个值称为掩码加入掩码(022),比如777 &(~022)777&755= 755

我们用umask设置掩码。


然后将st_size,这个值表示文件的长度。

  目录文件的 长度和目录的具体实现有关系,通常目录结构由 i节点和 目录名组成

   对于符号链接来说,文件长度是是指向的文件的文件路径长度

   普通文件就是内容的长度

大多unix 提供 st_blksize 和st_blocks,前者是对文件I/O操作较适合的长度,这样操作效率会较高。后者是实际分配的512字节块的数量.


接着讲文件系统,会介绍完剩下的属性


硬盘可以分成多个分区,每个分区有不同的文件系统。这里介绍一下unix的文件系统。


一个分区分为三部分:
+ 超级块, 文件系统中第一块被称为超级块。这个块存放文件系统本身的结构信息,比如每个区域的大小,未被使用的磁盘块的信息。
+ i节点, 超级块的下一个部分就是i节点表,文件系统中的每个文件在该表中都对应一个i节点。i节点是固定长度的记录项,它包含有关文件的大部分信息。Linux文件系统使用 索引节点i 来记录文件信息,索引节点是一个结构,用固定长度,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。
+ 数据区, 文件的内容保存在这个区域上,磁盘上所有块的大小都一样,如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中,并把磁盘块的分配情况记录在文件的i节点中的磁盘序列表中。

仔细观察一个柱面组的i节点和数据块部分,可以看到下图所示情况

apue 第四章_第1张图片



一个文件系统维护了一个索引节点的数组 即为目录项,目录项中的每一项包括文件索引节点i的节点号和文件名,所以目录只是将文件的名称和它的索引节点号结合在一起的一张表。
对于一个文件来说有唯一的索引节点与之对应,而一个索引节点却可以有多个文件名与之对应,因此磁盘上的同一个文件可以通过不同的路径去访问它。
 
在上图中有两个目录项指向同一i节点(st_ino)。每个i节点有一个链接计数器,其值是指向该i节点的目录项数。只有当链接计数器减少为0时,才可删除该文件。这也就是为什么解除对一个文件的链接操作并不总是意味着,释放该文件占用的磁盘块的原因。而且删除一个目录项的函数被称为unlink而不是delete的原因。st_nlink便是这个计数器。
每个文件系统都对它们的i节点进行编号,因此目录项中的i节点指向同一文件系统的i节点,不能使一个目录项指向另一个文件系统的i节点,因此硬连接不能跨越文件系统。
 当在不更换文件系统情况下为一个文件更名时,该文件的实际内容并未移动,只需构造一个指向现有i节点的新目录项,并解除与旧目录项的链接。这就是mv命令的通常操作方式。
 



符号链接(软链接)和硬链接的区别:
可以用ln命令对一个已经存在的文件建立一个新的连接,而不复制文件的内容。连接有软连接和硬连接之分,软连接又叫符号连接。
符号链接是指向一个文件的间接指针,硬链接直接指向文件的i节点。
 硬连接                                软连接     
 硬链接指向文件的i节点                 它的数据是它所连接的文件的路径名,是指向一个文件的间接指针 
 目录不能有硬连接,但超级用户可以      目录也适用
 不能跨越文件系统                      可以跨越文件系统
 文件在磁盘中只有一个拷贝              也是只有一份拷贝
 索引节点的引用为0时才可以删除文件     可以删除原有文件保留连接文件,没有防误删功能  
 可以防止误删除



 

 

 

你可能感兴趣的:(文件系统)