文章目录
1 函数link和函数linkat
任何一个文件可以有多个目录项指向其i节点。创建一个指向现有文件的链接的方法是使用link函数或linkat函数。
我们要知道,link创建的链接属于硬链接。
1.1 link函数原型
#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);
1.2 参数说明
exitingpath:现有文件路径
newpath:创建新的目录项
efd:存在的文件描述符
nfd:新建的文件描述符
flag:当现有文件是符号链接时,有flag参数来控制linkat函数是创建指向现有符号链接的链接还是创建指向现有符号链接所指向的文件的链接。如果在flag参数中设置了AT_SYMLINK_FOLLOW标志,就创建指向符号链接目标的链接。如果这个标志被清除了,则创建一个指向符号链接本身的链接。
1.3 返回值
这两个函数创建一个新目录项newpath,它引用现有文件existingpath。
若成功,返回0;若出错,返回-1。
1.4 示例
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char *argv[]){
if(link("../data/tmpfile","../data/tmpfile_link") < 0){
perror("link error");
exit(1);
}
printf("file linked\n");
exit(0);
}
运行结果:
此时在data目录下生成一个tmpfile_link,里面的内容和tmpfile一样。
2 函数unlink和函数unlinkat
为了删除一个现有的目录项,可以调用unlink函数。
2.1 unlink函数原型
#include<unistd.h>
int unlink(const char *pathname);
int unlinkat(int fd,const char *pathname,int flag);
2.2 参数说明
pathname:文件路径名
flag:flag参数给出了一种方法,使调用进程可以改变unlinkat函数的默认行为。当AT_REMOVEDIR标志被设置时,unlinkat函数可以类似与rmdir一样删除目录。
2.3 返回值
这两个函数删除目录项,并将由pathname所引用文件的链接计数减1。
若成功,返回0;若出错,返回-1。
2.4 示例
下面程序是将当前具有访问权限O_RDWR的文件修改成具有O_RDWR|O_NONBLOCK的权限,要记住,只有在当前进程中有效,如果进程退出,此文件的访问权限依旧是O_RDWR
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char *argv[]){
//建立文件硬链接,相当于生成一个新的文件
if(link("../data/tmpfile","../data/tmpfile_link") < 0){
perror("link error");
exit(1);
}
//删除源文件,但备份文件还存在,即tmpfile被删除了,tmpfile_link文件还在
if(unlink("../data/tmpfile") < 0){
perror("unlink error");
exit(1);
}
printf("file unlinked\n");
exit(0);
}
结果源文件删除,备份文件还存在。
3 函数remove
函数remove基础对一个文件或目录的链接。对于文件,remove的功能与unlink相同。对于目录,remove的功能与rmdir相同。
3.1 remove函数原型
#include<stdio.h>
int remove(const char *pathname);
3.2 参数说明
pathname:文件路径
3.3 返回值
若成功,返回0;若出错,返回-1。
4 函数symlink和函数symlinkat
可以用这两个函数创建一个符号链接。
4.1 symlink函数原型
#include<unistd.h>
int symlink(const char *actualpath,const char *sympath);
int symlinkat(const char *actualpath,int fd,const char *sympath);
4.2 参数说明
actualpath:现有目录项
sympath:指向actualpath的新目录项sympath
fd:文件描述符
我们要知道,在创建此符号链接时,并不要求actualpath已经存在。并且,actualpath和aympath并不需要位于同一文件系统中。
4.3 返回值
若成功,返回0;若出错,返回-1。