APUE(四)

来源:互联网 发布:淘宝卖中年女秋衣服了 编辑:程序博客网 时间:2024/04/20 14:06
 文件和目录

简介
讲述文件系统的特征和文件的属性,以及修改这些属性的函数。同时会看到一些Unix文件系统和符号链接的细节。

stat, fstat, 和 lstat 函数
本章的学习集中在下面三个函数和它们的返回信息
#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *restrict pathname, struct stat *restrict buf);
All three return: 0 if OK, 1 on error
stat返回的是给定路径名的文件的结构信息。fstst获得已打开的描述符为filedes的文件信息。lstat和stat类似,但在处理符号链接时,lstat返回的是符号链接本身的信息,而非符号链接引用的文件的信息。

描述文件信息的结构体
struct stat {
       mode_t    st_mode;      /* 文件类型 & 模式 (权限) */
       ino_t     st_ino;       /* i结点号 (序列号) */
       dev_t     st_dev;       /* 设备号 (文件系统) */
       dev_t     st_rdev;      /* 特殊文件的设备号*/
       nlink_t   st_nlink;     /* 链接号 */
       uid_t     st_uid;       /* 所有者的user ID */
       gid_t     st_gid;       /* 所有者的group ID */
       off_t     st_size;      /* 普通文件(regular file)的大小,以字节为单位 */
       time_t    st_atime;     /* 上次访问的时间 */
       time_t    st_mtime;     /* 上次修改的时间 */
       time_t    st_ctime;     /* 上次文件状态改变的时间 */
       blksize_t st_blksize;   /* I/O块的最佳大小 (best I/O block size)  */
       blkcnt_t  st_blocks;    /* 分配的磁盘块数目 */
     };

文件类型
1.普通文件
2.目录文件。任何对于某目录有读权限的进程都可以读取目录的内容,但只有内核才能直接向目录文件做写操作。
3.块特殊文件(block special file)
4.字符特殊文件(character special file)
5.FIFO,用与进程间通信的文件类型,也叫命名管道。
6.Socket,用于进程间的网络通信,但也可以用于同一台机器的进程间通信。
7.符号链接,指向其他文件的一种文件类型
定义在<sys/stat.h>中用于判断文件类型的宏
S_ISREG()、S_ISDIR()、S_ISCHR()、S_ISBLK()、S_ISFIFO()、S_ISLNK()、S_ISSOCK()

Set-User-ID 和 Set-Group-ID
与每个进程相关的用户ID和组ID有:
×real user ID real group ID标识我们的真正身份,这两个域在我们登录时从口令文件获得。在一个登录会话中,它们的值通常是不变的,但有超级用户进程可以改变它们。
×effective user ID, effective group ID, 和 supplementary group IDs 用来确定我们的文件访问权限。
×当一个程序执行时,saved set-user-IDsaved set-group-ID 包含了effective user ID 和 the effective group ID的拷贝。

当我们执行一个程序文件时,进程的effective user ID 通常等于 real user ID, effective group ID 通常等于 real group ID。在文件的模式字st_mode中有两个位set-user-ID bit 和 set-group-ID,当它们被置位时,进程的effective user ID设置为文件的所有者(st_uid),进程的effective group ID被设置成文件的组所有者(st_gid)。比如,某文件的所有者是超级用户,并且它的set-user-ID被置位,那么此文件作为一个进程运行时,该进程就具有了超级用户权限,而不管它的real user ID是什么。因此为防止其他用户通过该程序对所有者其他文件的滥用,文件所有者对于这种程序的能力应该进行限制。
设置一个文件的set-user-ID,输入chmod u+s filename,但要确保该文件设置了group-other执行权限。

文件访问权限
每个文件都有9个权限,<sys/stat.h>定义的访问权限位
S_IRUSR user-read
S_IWUSR user-write
S_IXUSR user-execute
S_IRGRP group-read
S_IWGRP group-write
S_IXGRP group-execute
S_IROTH other-read
S_IWOTH other-write
S_IXOTH other-execute

如果通过名字打开某个文件,那么对于在该名字(路径)中出现的目录,包括隐藏着的当前目录,我们都要有执行权限,因此目录的执行权限位也叫做搜索位(search bit)。
对一个目录的写权限和执行权限是不同的概念:前者可以使我们读取目录,获得目录中文件名的列表;当目录名是我们试图访问的路径名的一个组成部分时,后者使我们可以通过该目录(pass through the directory)。
如果在open函数中,指定了选项O_TRUNC,那么我们必须有对文件的写操作权限。
如果要在某个目录中创建一个新文件,我们必须要有在该目录的写权限和执行权限。
如果删除一个已存在的文件,我们需要其所在目录的写权限和执行权限,而不必需要该文件本身的读、写权限。
当用6个exec函数执行某个文件时,它的执行权限是必须的。

当进程要打开、创建或删除一个文件时,内核都要作访问测试。
1.如果进程的effective user ID是0(即超级用户),访问被允许。这就使得超级用户可以自由驾驭整个文件系统。
2.如果进程的effective user ID等于文件的所有者ID,而且适当的用户访问权限被置位,那么访问被允许。
3.如果进程的effective group ID,或者其中一个补充组ID(the supplementary group IDs )等于文件的组ID,而且相应的组访问权限被置位,那么访问被允许。否则,拒绝。
4.如果其它访问权限被正确置位,访问允许,否则拒绝。
以上四条自上而下,如进程是文件的所有者(满足上面第2条),访问允许或拒绝就看用户访问权限,无需再看组权限。

新文件和新目录的所有权
新文件的用户ID设置为进程的effective user ID,在POSIX.1,新文件的组ID可能是1)进程的effective group ID 2)文件所在目录的组ID
...
原创粉丝点击