</pre><pre>
</pre><pre>
4.1 引言
上一章主要是为荣的I/O进行的(打开文件,读文件,写文件),本章讲描述文件系统的其他特征和文件的性质。从stat函数开始,诸葛说明stat结构的每一个成员以及了解文件的所有属性。在此过程中讲介绍修改这些属性的各个函数(更改所有者和权限),更加详细的说明UNIX文件系统的结构以及符号链接(symbolic links),本章最后介绍对目录操作的各个函数,并且开发一个以降序遍历目录结构的函数
4.2 函数stat, fstat, fstatat和lstat
#include<sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *restrict pathname, struct stat *restrict buf);
int fstatat(int fd, const char *restrict pathname, struct stat *restrict buf, int flag);
fstat:通过描述符(descriptor)打开文件的有关信息
lstat:与stat类似,但是当命名文件是一个符号链接(symbolic link)时,lstat返回的是符号链接的信息,而不是符号链接所引用的文件的信息(not the file referenced by the symbolic link)
fstatat:为一个相对于当前打开目录(由fd参数指向)的路径名返回文件的统计信息,flag参数控制这是否跟随这个符号链接。
(1)当flag设置AT_SYMLINK_NOFOLLOW标志是,fstatat不会跟随符号链接,而是返回符号链接本身信息。否则默认情况下,返回的是符号链接所指项的实际文件的信息。
(2)如果fd参数的值是AT_FDCWD,并且pathname参数是一个相对路径名,fstatat会计算相对于当前目录的pathname参数。如果pathname是一个绝对路径,fd参数就会被忽略。这两种情况下,根据flag的值,fstata的作用就和stat和lstat一样
buf的结构体
4.3 文件类型
我们已经介绍了两种不同的文件类型:普通文件和目录
文件类型主要包含一下几种
(1)普通文件(regular file)。可以是普通文本或者二进制
(2)目录文件(directory file)。这种文件包含了其他文件的名字已经指向这些文件有关信息的指针
(3)块特殊文件(block special file)。这种类型的文件对设备提供带缓冲的访问,每次访问以固定长度为单位进行
(4)字符特殊文件(character special file)。对设备不带缓冲的访问,每次访问的长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件
(5)FIFO。这种文件用于进程间通信,特成为命名管道(named pipe)。
(6)套接字(socket)。这种类型的文件用于进程间的网络通信,也可以用在一台宿主机上进程之间的非网络通信。
(7)符号链接(symbolic link)。这种类型的文件指向另一个文件。
文件信息包含在stat结构的st_mode成员中,st_mode成员如下
4.4 设置用户ID和设置组ID
4.5 文件访问权限
4.6 新文件和目录的所有权(Ownership of New Files and Directories)
4.7 函数access和faccessat
#include <unistd.h>
int access(const char * pathname, int mode);
int faccessat(int fd, const char * pathname, int mode, int flag);
mode为F_OK测试文件是否存在,还可以用
4.8 函数unask
<span style="font-weight: normal;">为每个与进程相关联的文件模式创建屏蔽字umask函数为进程设置文件模式,也就是使用umask之后,该进程所创建的文件的相关权限都会被关闭掉的umask值为0,可以保证任何用户都能读文件用户可以设置umask值控制他们所创建的文件的默认权限</span>
4.9 函数chmod, fchmod和fchmodat
这三个文件可以更改现有文件的访问权限
#include<sys/stat.h>
int chmod(const char *pathname, mode_mode);
int fchmod(int fd, mode_t mode);
int fchmodat(int fd, const char *pathname, mode_t mode, int flag);
flag参数用于改变fchodat的行为,当设置了AT_SYMLINK_NOFOLLOW标志时,fchmodat并不会跟随符号链接(symbolic links)
4.10 粘着位(Sticky Bit)
4.11 函数chown, fchown, fchownat, and lchown
#include <unistd.h>
int chown(const char *pathname, uid_t owner, git_t group);
int fchown(int fd, uid_t owner, git_t group);
int fchownat(int fd, const char *pathname, uid_t owner, git_t group, int flag);
int lchown(const char *pathname, uid_t owner, git_t group);
如果flag参数中设置了AT_SYMLINK_NOFOLLOW标志,则fchown和lchown效果相同
当_POSIX_CHOWN_RESTRICTED有效时,不能更改其他用户文件的用户ID。可以所用有的文件的组ID,单只能更改你所属的组
4.12 文件长度
4.13 文件截断(File Truncation)
#include <unistd.h>
int truncate(const char *pathname, off_t length);
int ftruncate(int fd, off_t length);
这两个函数将一个现有的文件长度截断为length。如果文件长度小于length,则文件长度变成length
4.14 文件系统
4.15 函数link, linkat, unlink, unlinkat和remove
#include<unistd.h>
int link(const char *existingpath, const char *newpath);
int linkat(int efd, const char *existingpath, int nfd, const chat *newpath, int flag);
这两个函数创建一个新的目录项newpath, 它引用现有的文件existingpath。如果newpath已经存在则返回出错
#include <unistd.h>
int unlink(const char *pathname);
int unlinkat(int fd, const char *pathname, int flag);
关闭一个文件是,内核会检查打开该文件的进程数,如果个数为0再检查链接计数,如果计数也为0则删除该文件
#include<unistd.h>
int symlink(const char *actualpath, const char *sympath);
int symlinkat(const char *actualpath,int fd, const char *sympath);
除了oldname或newname指向相对路径名时,其他情况这两个函数都是一样的
4.16 函数rename和renameat
4.17 符号链接(Symbolic Links)
4.18 创建和读取符号链接
#include<stdio.h>
int rename(constt chat *oldname, const char *newname);
int renameat(int oldfd, const char *oldname, int newfd, const char *newname);
4.19 文件的时间
4.20 函数futimens, utimensat, utimes
4.21 函数mkdir, mkdirat和rmdir
#include <sys/stst.h>
int mkdir(const chat *pathname, mode_t mode);
int mkdirat(int fd, const char *pathname, mode_t mode);
rmdir删除目录,但要求一定是空的
4.22 读目录
4.23 函数chdir, fchdir, getcwd
#include<unistd.h>
int chdir(const char *pathname);
int fchdir(int fd);
这两个函数分别用pathname和打开的文件描述符来制定新的当前工作目录