4.2 stat、fstat和lstat函数
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *pathname, struct stat * buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
- 三个函数返回0表示成功,-1表示失败
- 三个函数的目的都是获取文件相关的信息结构,只不过stat提供的是路径,fstat提供的是文件描述符,lstat的路径是一个符号链接的路径
4.3 文件类型
- 普通文件
- 目录文件:对一个目录文件具有读许可权的任一进程都可以读该目录的内容,但只有内核可以写目录文件;
- 字符特殊文件
- 块特殊文件:这种文件典型的用于磁盘设备,系统中的所有设备或者是字符特殊文件,或者是块特殊文件;
- FIFO:这种文件用于建承建的通信,有时也将其称为命名管道;
- 套接口:这种文件用于进程间的通信
- 符号连接
4.4 设置-用户-ID和设置-组-ID
- 可以在文件方式字(st_mode)中设置一个特殊标志,其定义是“当执行此文件时,将进程的有效用户ID设置为文件的所有者(st_uid)”
- 在文件方式字中可以设置另一位,它使得执行此文件的进程的有效组ID设置为文件的组所有者
4.5 文件存取许可权
- st_mode也包含了对文件的存取许可权位
4.6 新文件和目录的所有权
- 新文件的组ID可以是进程的有效组ID
- 新文件的组ID可以是它所在目录的组ID
4.7 access函数
- access函数是按实际用户ID和实际组ID进行存取许可权测试的
- access函数范围0表示成功,返回-1表示出错
#include <unistd.h>
int access(const char *pathname, int mode);
mode | 说明 |
---|---|
R_OK | 测试读许可权 |
W_OK | 测试写许可权 |
X_OK | 测试执行许可权 |
F_OK | 测试文件是否存在 |
4.8 umask函数
- umask函数为进程设置文件方式穿件屏蔽字,并返回以前的值
- cmask由下表中的9个常数(S_IRUSR,S_IWUSR等)逐位“或”构成
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t cmask)
st_mode屏蔽 | 意义 |
---|---|
S_IRUSR | 用户-读 |
S_IWUSR | 用户-写 |
S_IXUSR | 用户-执行 |
S_IRGRP | 组-读 |
S_IWGRP | 组-写 |
S_IXGRP | 组-执行 |
S_IROTH | 其他-读 |
S_IWOTH | 其他-写 |
S_IXOTH | 其他-执行 |
4.9 chmod和fchmod函数
#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);
int fchmod(int filedes, mode_t mode);
4.10 粘住位
目前不需要了
4.11 chown,fchown和lchown函数
- 三个函数返回:若成功则为0, 若出错则为-1
#include <sys/types.h>
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int filedes, uid_t owner, gid_t group);
int lchown(const char *pathname, uid_t owner, gid_t group);
4.12 文件长度
- stat结构的成员st_size包含了以字节为单位的该文件的长度,此字段只对普通文件、目录文件和符号连接有意义
4.13 文件截短
- 在文件尾端处截去一些数据以缩短文件
- 将长度截短为0,用O_TRUNC标志做到这一点
- 两个函数返回:若成功则为0,若出错则为-1
#include <sys/types.h>
#include <unistd.h>
int truncate(const char *pathname, off_t length);
int ftruncate(int filedes, off_t length);
4.14 文件系统
- 注意在图中有两个目录项只想同一i节点:每个i节点中都有一个连接结束,其值是只想该i节点的目录项数,只有当连接技术减少为0时,才可以删除该文件,在stat结构中,连接计数包含在st_nlink成员中,其基本系统数据类型是nlink_t
- 另外一种连接类型称之为符号连接(symbolic link):我对这种连接的理解就是windows下面的快捷方式
- i节点包含了所有与文件有关的信息:文件类型、文件存取许可权位、文件长度和指向改文件所占用的数据块的指针等等;stat结构中的大多数信息都取自i节点;
4.15 link,unlink,remove和rename函数
- 任何一个文件可以有多个目录项只想其i节点,穿件一个向现存文件连接的方法是使用link函数
- unlink函数可以删除一个现存的目录项
- remove函数解除对一个文件或目录的连接,对于文件,remove的功能与unlink相同,对于目录,remove的功能与rmdir相同
- 文件或目录用rename函数更名
#include <unistd.h>
int link(const char *existingpath, const char *newpath);
int unlink(const char *pathname);
#include <stdio.h>
int remove(const char *pathname);
int rename(const char *oldname, const char *newname);
4.17 symlink和readlink函数
- symlink函数穿件一个符号连接
4.18 文件时间
字段 | 说明 | 例子 | ls(l)选择项 |
---|---|---|---|
st_atime | 文件数据的最后存取时间 | read | -u |
st_mtime | 文件数据的最后修改时间 | write | 缺省 |
st_ctime | i节点状态的最后修改时间 | chmod,chown | -c |
4.19 utime函数
一个文件的存取和修改时间可以用utime函数更改
4.20 mkidr和rmdir函数
用mkdir函数创建目录, 用rmdir函数删除目录
4.21 读目录
4.22 chdir,fchdir和getcwd函数
- 进程调用chdir或fchdir函数可以修改当前工作目录
- getcwd可以获取当前目录