文件和目录(二)
4.8 更改文件实际用户ID和实际组ID
#include <unistd.h> int chown(const char *pathname, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int fchownat(int fd, const char *pathname, uid_t owner, gid_t group, int flag); int lchown(const *pathname, uid_t owner, gid_t group); 返回值:成功返回0,出错返回-1 |
(2) 在富豪链接情况下,lchown和fchownat(设置了AT_SYMLINK_NOFOLLOW标志)更改符号链接本身的所有者,而不是该符号链接所指向的文件的所有者。
(3) 基于BSD的系统一直规定只有超级用户才能更改一个文件的所有者。System V则允许仁义用户更改他们所拥有的文件的所有者。
4.9 文件截断
#include <unistd.h> int truncate(const char *pathname, off_t length); int ftruncate(int fd, off_t length); |
4.10 创建一个现有文件的链接
#include <unistd.h> int link(const char *existingpath,const char *newpath; int linkat(int efd,const char *existingpath, int nfd, const char *newpath, int flag); 返回值:成功返回0,出错返回-1 |
当现有文件是符号链接时,有flag参数来控制linkat函数是创建指向现有符号链接的链接还是创建指向现有符号链接所指向的文件的链接。flag参数设置了AT_SYMLINK_NOFOLLOW标志,就创建指向符号链接目标的链接。
4.11 删除现有的目录项
#include <unistd.h> int unlink(const char *pathname); int unlinkat(int fd, const char *pathname, int flag); 返回值:成功返回0,出错返回-1 |
flag参数给出了一种方法,使调用进程可以改变unlinkat函数的额默认行为,当AT_REMOVEDIR标志被设置时,unlinkat函数可以类似于rmdir一样删除目录。
4.12 创建和读取符号链接
符号链接是对一个文件的简介指针,而硬链接直接指向文件的i节点,引入符号链接是为了避开硬链接的一些限制。硬链接通常要求链接和文件位于同一文件系统中;只有超级用户才能创建指向目录的硬链接。 #include <unistd.h> int symlink(const char *actualpath, const char *sympathy); int symlinkat(const char *actualpath, const char *sympathy); 返回值:成功返回0,错误返回-1 |
因为open函数跟随符号链接,所以需要有一种方法打开该链接本身,并读该连接中的名字。
#include <unistd.h> ssize_t readlink(const char *pathname, char *buf, size_t bufsize); ssize_t readlinkat(int fd, const char *pathname, char *buf, size_t bufsize); 返回值:成功返回读取的字节数,出错返回-1 |
4.13 读目录函数
#include <dirent.h> DIR *opendir(const char *pathname); DIR *fdopendir(int fd); 返回值:成功返回目录指针,出错返回NULL
struct dirent *readdir(DIR *dp); 返回值:成功返回dirent结构指针,若在目录尾或出错,返回NULL
void rewinddir(DIR *dp); int closedir(DIR *dp); 返回值:成功返回0,出错返回-1
long telldir(DIR *dp); 返回值:与dp关联的目录中的当前位置
void seekdir(DIR *dp,long loc); |
有opendir和fdopendir返回的指向DIR。opendir执行初始化操作,使第一个readdir返回目录中的第一个目录项。DIR结构有fdopendir创建时,readdir返回的第一项取决于传给fdopendir函数的文件描述符相关的文件偏移量。
4.14 mkdir、mkdirat、rmdir函数
4.14.1 创建空目录
#include <sys/stat.h> int mkdir(const char *pathname, mode_t mode); int mkdirat(int fd, const char *pathname, mode_t mode); 返回值:成功返回0,出错返回-1 |
对于目录通常至少要设置一个执行权限位,以允许访问该目录中的文件名。
4.14.2 删除空目录
#include <unistd.h> int rmdir(const char *pathname); 返回值:成功返回0,失败返回-1 |
如果链接计数达到0时,有一个 或多个进程打开此目录,则在此函数返回前删除最后一个链接. 和 ..项。而且在此目录中不能再创建新文件,但是在最后一个进程关闭它之前并不释放此目录。
4.15 文件权限位总结
mode常量 | 说明 | 对普通文件的影响 | 对目录文件的影响 |
S_ISUID | 设置用户ID | 执行时设置有效用户ID |
|
S_ISGID | 设置组ID | 若组执行位设置,则执行时设置有效组ID;否则使强制性起作用 | 将目录中创建的新文件的组ID设置为目录的组ID |
S_ISVTX | 粘着位 | 在交换区缓冲程序正文 | 限制在目录中删除和重命名文件 |
S_IRWXU | 用户读写执行 | 许可用户读写执行文件 | 许可用户读目录项,删除和创建目录,搜索给定路径名 |
S_IRUSR | 用户读 | 许可用户读文件 | 许可用户读目录项 |
S_IWUSR | 用户写 | 许可用户写文件 | 许可用户在目录中删除和创建文件 |
S_IXUSR | 用户执行 | 许可用户执行文件 | 许可用户在目录中搜索给定路径名 |
S_IRWXG | 组读写执行 | 许可组读写执行文件 | 许可组读目录项,删除和创建目录,搜索给定路径名 |
S_IRGRP | 组读 | 许可组读文件 | 许可组读目录项 |
S_IWGRP | 组写 | 许可组写文件 | 许可组在目录中删除和创建文件 |
S_IXGRP | 组执行 | 许可组执行文件 | 许可组在目录中搜索给定路径名 |
S_IRWXO | 其他读写执行 | 许可其读写执行文件 | 许可其他读目录项,删除和创建目录,搜索给定路径名 |
S_IROTH | 其他读 | 许可其他读文件 | 许可其他读目录项 |
S_IWOTH | 其他鞋 | 许可其他写文件 | 许可其他在目录了中删除和创建文件 |
S_IXOTH | 其他执行 | 许可其他执行文件 | 许可其他在目录中搜索给定路径名 |