Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39213
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-08 13:03
个人简介

海纳百川有容乃大,壁立千仞无欲则刚。

文章分类
文章存档

2015年(17)

2014年(12)

我的朋友

分类: LINUX

2015-03-09 11:05:18

1. stat结构
    st_mode;    /* file type & mode (permissions) */
    st_ino;     /* i-node number (serial number) */
    st_dev;     /* device number (file system) */
    st_rdev;    /* device number for special files */
    st_nlink;   /* number of links */
    st_uid;     /* user ID of owner */
    st_gid;     /* group ID of owner */
    st_size;    /* size in bytes, for regular files */
    st_atime;   /* time of last access */
    st_mtime;   /* time of last modification */
    st_ctime;   /* time of last file status change */
    st_blksize; /* best I/O block size */
    st_blocks;  /* number of disk blocks allocated */

2. 七种文件类型
    普通文件(测试宏S_ISREG)
    目录文件(测试宏S_ISDIR):
        对一个目录文件具有读权限的任一进程都可以读该目录的内容,但只有内核可以直接写目录文件。
        很多实现阻止应用程序使用read函数读目录的内容,从而进一步讲应用程序和目录格式中的实现的细节隔离开。
    块特殊文件(测试宏S_ISCHR)
    字符特殊文件(测试宏S_ISBLK)
        我觉得以上两种文件时操作系统对硬件设备的一种抽象
    FIFO(测试宏S_ISFIFO)
    套接字(测试宏S_ISLNK)
    符号链接(测试宏S_ISSOCK)

3. 实际用户/组ID:我们究竟是谁
   有效用户/组ID:决定文件访问权限
   保存的设置用户/组ID:执行一个程序时包含了有效用户/组ID的副本
   通过设置 “设置用户/组ID位”后,在执行此文件时,将进程的有效用户/组ID设置为文件所有者的用户/组ID。

4. 文件的访问权限
    S_IRUSR    用户-读
    S_IWUSR 用户-写
    S_IXUSR 用户-执行

    S_IRGRP 组-读
    S_IWGRP 组-写
    S_IXGRP 组-执行

    S_IROTH 其他-读
    S_IWOTH 其他-写
    S_IXOTH 其他-执行

    只有对目录具有执行权限才能穿越目录
    只有对目录具有读和执行权限才能搜索目录
    只有对目录具有执行和写权限才能在目录中创建文件
    只有对目录具有执行和写权限才能在目录中删除文件

    文件的用户/组ID是文件的性质,有效用户/组ID是进程的性质,每次打开、创建或删除文件时,内核就进行文件访问权限测试:
        1. 进程的有效用户ID是超级用户(值为0),则允许访问
        2. 进程的有效用户ID等于文件所有者ID(该进程拥有此文件),那么若适当的访问权限位被设置,则允许访问,否则不再进行剩余权限判断,直接拒绝
        3. 进程的有效组ID或进程的附加组ID 等于文件组ID,那么若适当的访问权限位被设置,则允许访问,否则不再进行剩余权限判断,直接拒绝
        4. 进程的有效用户/组 ID 不属于前两种情况,那么若其他用户适当的访问权限位被设置,则允许访问,否则拒绝

    注:access函数是按实际用户ID和实际组ID进行访问权限测试的(以上规则将‘有效’改为‘实际’)

5. 新文件的目录所有权
    新文件的用户ID设置位进程的有效用户ID
    新文件的组ID:
        1. 新文件的组ID可以是进程的有效组ID
        2. 新文件的组ID可以是它所在目录的组ID
    (Linux & Solaris:如果目录的设置组ID位被设置,则新文件的组ID设置位目录的组ID,否则将新文件的组ID设置为进程的有效组ID)

6. 文件模式创建屏蔽字
    umask函数为进程设置文件模式创建屏蔽字,并返回以前的值
    对于任何在文件模式创建屏蔽字中为1的位,在文件mode中的相应位一定被关闭
   
7. 修改文件的访问权限 chmod & fchmod
    为了改变一个文件的权限位,进程的有效用户ID必须等于文件所有者ID,或者该进程必须具有超级用户权限

    S_ISUID 执行时设置用户ID
    S_ISGID 执行时设置组ID
    S_ISVTX 保存正文(粘住位)
    S_IRWXU 用户读、写、执行
    S_IRWXG 组读、写、执行
    S_IRWXO 其他读、写、执行
    特例:
        1. 如果没有超级用户特权的进程写一个文件,则设置用户ID位和设置组ID位将自动被清除
        2. 只有超级用户特权才能设置普通文件的粘住位(Linux无此限制,粘住位对Linux上的普通文件并无意义)
        3. 如果新文件的组ID不等于进程有效组ID或进程附加组ID中的一个,且进程没有超级用户特权,那么设置组ID位将自动被关闭
           
    注:chmod函数更新的只是i节点最近一次被更新的时间。ls -l 默认列出的是最后修改文件内容的时间
   
8. 粘住位
    如果对一个目录设置了粘住位,则只有对该目录具有写权限的用户在满足以下条件之一的情况下,才能删除或更改该目录下的文件:
        1. 拥有此文件
        2. 拥有此目录
        3. 是超级用户

9. 修改文件的用户ID和组ID
    只有超级用户进程才能更改文件的用户ID
    满足以下条件,一个非超级用户也可以更改文件的组ID:
        1. 进程拥有此文件
        2. 参数owner等于-1或文件的用户ID,并且参数group等于进程的有效组ID或进程的附加组ID之一。
        这意味着,你不能更改其他用户文件的用户ID。你可以更改你所拥有的文件组ID,但只能改到你所属的组。
    如果这些函数由非超级用户进程调用,则在成功返回时,该文件的设置用户/组ID位都会被清除

10. 文件长度
    st_size 表示以字节为单位的文件长度,只对普通文件,目录文件和符号链接有意义
    st_blksize 表示对文件I/O较适合的块长度
    st_blocks 表示所分配实际512字节块数量。
   
11. i节点
   
    一个i节点就是一个文件的表示
    i节点包含了大多数与文件有关的信息:文件类型、文件访问权限位、文件长度和指向文件实际数据块在磁盘上的位置的指针。stat结构中大多数信息取自i节点。只有两项数据存放在目录项中:文件名和i节点编号。
    每个文件系统各自对它们的i节点进行编号。
    每个i节点都有一个连接计数,其值是指向该i节点的目录项数。当链接计数减少至0时,才可删除该文件。POSIX.1常量LINK_MAX指定了一个文件链接数的最大值。这种链接类型称为硬链接,硬链接也是普通文件。
    另一个条件也会阻止删除文件的内容——只要有进程打开了该文件,其内容也不能被删除。关闭一个文件,内核首先检查打开该文件的进程数。如果达到0,然后内核检查其链接数,如果这个数也是0,那么就删除该文件。
    进程用open或create创建了一个文件,然后立即调用unlink,这样即使程序崩溃,它所创建的文件也不会遗留下来。当unlink函数传入的参数是符号链接,那么unlink删除该符号链接,而不会删除有链接所引用的文件。给出符号链接名的情况下,没有一个函数可以删除链接所引用的文件。
    当不更换文件系统情况下位一个文件更名时,该文件实际内容并未移动,只需要构造一个指向现有i节点的新目录项,并解除与旧目录项的链接。

12. 符号链接
    同时用O_CREAT和O_EXCL两者调用open函数,若路径名引用符号链接,open将出错返回
    各函数对符号链接的处理(图)
    symlink创建符号链接、readlink打开符号链接本身,并读该链接中的名字

13. 文件时间
    st_atime: 文件数据的最后访问时间
    st_mtime: 文件数据的最后修改时间(默认)
    st_ctime: i节点状态的最后更改时间
    ls命令
        -l或-t选项按文件的修改时间的先后顺序排序显示
        -u选项使其用访问时间排序
        -c选项用其更改状态时间排序
    utime函数更改一个文件的访问时间和修改时间:
        如果times是一个空指针,则访问时间和修改时间两者都设置位当前时间,为执行此条件,必须满足:
            进程有效ID必须等于该文件的所有者ID或者进程对该文件具有写权限

        如果times是非空指针,则访问时间和修改时间被设置。为执行此条件,必须满足
            进程有效ID必须等于该文件的所有者ID或者进程必须是一个超级用户进程,对文件只具有写权限是不够的

15. 工作目录
    每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点。使用chdir或fchdir函数可以更改当前工作目录,getcwd返回当前工作目录的绝对路径

16. 设备特殊文件
    每个文件系统所在的存储设备(用dev_t结构表示)都由其主次设备号表示。主设备号标识设备驱动程序,次设备号标识特定的子设备。通常可以使用宏major和minor来访问主次设备号。
    系统中与每个文件名关联的st_dev值是文件系统的设备号。
    只有字符特殊文件和块文件才有st_rdev值。此值包含实际设备的设备号。
阅读(459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~