目录
在文件系统中,目录与普通文件主要有两个区别。
- i节点条目中,会将目录标记为一种不同的文件类型。
- 目录是一种特殊的文件,本质上是一个表格,包含文件名和i节点编号。而文件的i节点中存储信息列表不包含文件名。
关于目录的系统调用有很多。
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
int mkdir(const char *pathname,mode_t mode); //mode和open()调用指定权限相似
int rmdir(const char *pathname);//删除的目录为空时,调用才会成功
DIR *opendir(const char *pathname);//打开目录,返回DIR类型结构指针
struct dirent *readdir(DIR *dirp);//从一个目录流中读取连续条目
int closedir(DIR *dirp);//关闭目录流
硬链接
硬链接是可以在不同目录下有多个文件名称,均指向相同的i节点,也就是指向相同的文件。因此每个文件都会有一个i节点的链接计数。在删除文件时,将相应的i节点的链接计数减一,若链接计数因此降为0,才释放文件名所指带的i节点和数据块。
ln abc def。为文件abc创建一个硬链接def。利用系统调用link()和unlink()分别创建和移除硬链接。
#include <unistd.h>
int link(const char *oldpath,const char *newpath);
int unlink(const char *pathname);
硬链接的限制有两点,均可用符号链接取代:
- 硬链接必须与指代文件在同一个文件系统。因为只有在同一个文件系统,才能保证指向相同的一个i节点。
- 不能为目录创建硬链接。
软链接(符号链接)
符号链接是一个内容包含了另一个文件名称的文件,其不会加入文件的链接计数中,因此可以链接不同文件系统中的一个文件。
ln -s abc def。为文件abc创建一个符号链接def。利用系统调用symlink()和readlink()可以创建符号链接。
#include <unistd.h>
int symlink(const char *filepath,const char *linkpath);
int readlink(const char *pathname,char *buffer,size_t bufsiz);
参考 《TLPI》、《APUE》