第4章文件与目录
4.1 stat、fstat和lstat函数
Int stat(const char * restrictpathname,struct stat* restrict buf);//返回与命名文件有关的信息结构
Int fstat(int filedes,struct stat*buf); //打开文件的有关信息
Int lstat(const char* restrictpathname,struct stat *restrict buf); //符号链接的有关信息
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;//文件所有者的用户id
Gid_t st_gid//文件所有者的组id
Off_t st_size;//文件的字节长
Time_t st_atime;//上次访问的时间
Time_t st_mtime;//上次修改的时间
Time_t st_ctime;//上次文件状态修改的时间
Blksize_t st_blksize;//最好I/O块大小
Blkcnt_t st_blocks;//磁盘块分配的数量
}
4.2文件类型<sys/stat.h>
Unix文件类型主要包括:
普通文件:文本文件或者二进制文件,S_ISREG()
目录文件:包含了其他文件的名字以及指向这些文件有关信息的指针,S_ISDIR()
块特殊文件:对设备带缓冲的访问,且访问长度固定, S_ISBLK()
字符特殊文件:对设备不带缓冲的访问,且访问长度可变,S_ISCHR()
FIFO:用于进程之间通信,也称为管道,S_ISFIFO()
套接字:用于进程之间的网络通信,S_ISSOCK()
符号链接:指向另一个文件,S_ISLNK()
4.3 设置用户ID与设置组ID
实际用户ID,实际组ID 与系统登陆口令文件中的登陆项有关
有效用户ID,有效组ID,附加组ID用于文件访问权限检查
保存的设置用户ID,保存的设置组ID,实际上是有效用户ID与有效组ID的副本
4.4文件访问权限
由9位二进制数表示xxx xxxxxx 前三位表示文件所有者的用户权限即可读/可写/可执行,中间三位表示文件所有组即可读/可写/可执行,后三位表示文件其他即可读/可写/可执行
文件的读/写/执行,文件的读写权限由open()决定
目录的读:即获取目录下的全部文件名
目录的写:允许增加或者删除目录下的文件
目录的可执行:允许搜索目录下的特定文件
通过open()或者create()创建的新文件的用户ID为该进程的有效用户ID
新文件的组ID则为该进程的有效组ID
新文件的组ID还可以为所在目录的组ID
4.5umask()函数
通过umask()可以设置统一的文件权限,比如002 则对应文件权限为rwx rwx rx
4.6修改文件权限
Int chmod(const char*pathname,mode_t mode);//通过文件名修改
Int fchmod(int filedes,mode_t mode);//通过文件描述符修改
4.7 粘住位
/tmp和/var/spool/uucppublic,只有拥有此文件/拥有此目录/超级用户 才能对此文件进行删除或者更名
4.8chown、fchown和lchown函数
用于更改文件的用户ID和组ID
Int chown(const char *pathname,uid_towner,gid_t group);
Int fchown(int filedes,uid_t owner,gid_tgroup);
4.9 文件截取
Int truncate(const char *pathname,off_tlength);
Int ftruncate(const char *pathname,off_tlength);
如果文件以前的长度大于length,则超过length以外的数据就不再访问
4.10文件系统
Unix操作系统由内到外依次是内核->系统调用->库函数->shell->应用软件
POSIX:可移植的操作系统接口
基本系统数据类型:
caddr_t:核心地址
clock_t 时钟滴答计数器
comp_t 压缩的时钟滴答
dev_t 设备号
fd_set 文件描述符
fpos_t 文件位置
gid_t 组ID
ino_t i节点编号
mode_t 文件类型
nlink_t 目录项的链接计数
off_t 文件的偏移量
pid_t 进程ID与进程组ID
ptrdiff_t 两指针相减的结果
rlim_t 资源限制
sig_atomic_t 能原子地访问的数据类型
sigset_t信号集
size_t 对象大小
ssize_t返回字节计数的函数
time_t日历时间的秒计数器
uid_t数值用户ID
wchar_t字符码
硬链接:允许多个目录项指向同一个i节点,每个i节点中均有一个链接计数,只有当链接技术减少至0时,才能删除该文件,其中链接计数包含在stat结构的st_nlink成员中,类型为nlink_t
符号链接:该文件的实际内容包含该符号连接所指向文件的名字,i接待你的文件类型是S_IFLNK
P87
Stat结构中的大部分信息取至i节点,只有两项数据存放在目录项(文件名和i节点标号)
创建一个新目录:则新目录的i节点的类型为目录文件,且其链接计数为2(命名该目录的目录项)以及在该目录中的.项,则其父目录大的链接计数大于或者等于3,因为还包含子目录的..项。
4.15 link、unlink、remove和rename
int link(const char* existingpath,const char *newpath);//根据existingpath创建一个硬链接newpath,实质上是创建了一个新目录项指向该文件的i节点,且i节点的链接计数+1;
int unlink(const char *pathname); //删除了对应的目录项且其指向的i节点的链接计数-1;
int remove(const char*pathname);,对于文件而言,与unlink函数功能相同,而对于目录而言与rmdir相同
int rename(const char *oldname,const char*newname); //为文件/目录更名
4.16 符号链接
Int symlink(const char *actualpath,constchar *sympath);//创建符号链接
Ssize_t readlink(const char *restrictpathname.char *restrict buf,size_t bufsize);//执行读操作
4.17 文件的时间
St_mtime:内容最后一次被修改的时间
St_ctime:i节点最后一次被修改的时间
#include<utime.h>
Int utime(const char *pathname,const structutimbuf *time); //文件的访问和修改时间
Struct utimbuf{
Time_t actime; //访问时间
Time_t modtime;//修改时间
}
4.18 mkdir和rmdir函数
Int mkdir(const char *pathname,mode_t mode);
Int rmdir(const char *pathname);//该目录的链接计数达到0,且无其他进程打开目录,则释放该目录占用的空间。
#include <dirent.h>
DIR *opendir(const char *pathname);//打开一个目录
Struct dirent *readdir(DIR *dp); //读目录
Void rewinddir(DIR *dp);//倒退目录
Int closedir(DIR *dp);//关闭目录
4.19 chdir,fchdir,getcwd(与工作目录有关)
Int chdir(const char *pathname);//修改当前工作目录
Int fchdir(int filedes);
Char *getcwd(char *buf,size_t size);//获得当前工作目录的绝对路径
4.23 设备特殊文件
UNIX文件系统中的存储设备通常由主次设备号表示,主设备号(major)标识设备驱动程序,次设备号(minor)标识特定的子设备
由于stat结构中包含st_dev是设备号,因此可通过major(st_dev)和minor(st_dev)分别获得主次设备