link 系列的函数,主要是用来创建链接,删除链接的。主要有 link、symlink、unlink、readlink
这几个。
它们的功能如下:
函数 | 功能 |
---|---|
link | 创建硬链接 |
symlink | 创建软链接(符号链接) |
unlink | 删除硬链接或软链接 |
readlink | 读取软链接文件自身内容(不是所指向的文件内容) |
1 实例
在此之前先创建测试文件 test.txt
$ echo hello > test.txt
$ ls -l test.txt
-rw-rw-r-- 1 allen allen 6 12月 2 14:26 test.txt
1.1 link
link 函数专门用来创建硬链接的,功能和 ln
命令一样。它主要做两件事:1) 创建一个目录项 2) inode 结构体引用计数加 1。这两步是一个原子操作,要么全部失败,要么全部成功。
- 函数原型
// 输入参数 oldpath: 原始文件名
// 输入参数 newpath: 新的硬链接名
// 返回 0 成功,-1 失败
int link(const char *oldpath, const char *newpath);
- 实例代码
// mylink.c
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if(link(argv[1], argv[2]) == -1) {
perror("link");
}
return 0;
}
- 编译和测试
$ gcc mylink.c -o mylink
$ ./mylink test.txt hellotest
这时会生成 hellotest 文件,和 test.txt 的内容完全一样。
1.2 symlink
该函数用来创建符号链接,功能和 ln -s
命令一样。
- 函数原型
// 输入参数 target: 原始文件名
// 输入参数 linkpath: 符号链接名
// 返回 0 成功,-1 失败
int symlink(const char *target, const char *linkpath);
- 实例代码
// mysymlink.c
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if (symlink(argv[1], argv[2]) == -1) {
perror("symlink");
}
return 0;
}
- 编译和测试
$ gcc mysymlink.c -o mysymlink
$ ./mysymlink test.txt nihaotest
执行完后会生生一个软链接 nihaotest.
1.3 unlink
对于硬链接来说,unlink 用来删除目录项,并把 inode 引用计数减 1,这两步也是一个原子过程。直到 inode 引用计数为 0,才会真正删除文件。
对于软链接来说,unlink 直接删除软链接,而不影响软链接指向的文件。
unlink 不能用来删除目录。想删除目录,可以使用 rmdir 函数或者 ANSI C 的 remove 函数。
- 函数原型
// 输入参数 pathname: 要删除的文件名
// 返回 0 成功,-1 失败
int unlink(const char *pathname);
- 实例代码
// myunlink.c
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if (unlink(argv[1]) == -1) {
perror("unlink");
}
return 0;
}
- 编译和测试
$ gcc myunlink.c -o myunlink
$ ./myunlink hellotest
执行完后,会删除 hellotest,同时 inode 引用计数减 1.
1.4 readlink
该函数用于读取符号链接文件自身内容,而不是符号链接所指向的文件内容。
- 函数原型
// 输入参数 pathname: 符号链接名
// 输出参数 buf: 接收缓冲区
// 输入参数 bufsiz: 缓冲区大小
// 返回 -1 失败。成功返回读取数据的实际大小
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
- 实例代码
// myreadlink.c
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
char buf[256] = { 0 };
if (readlink(argv[1], buf, 256) == -1) {
perror("readlink");
}
printf("%s\n", buf);
return 0;
}
- 编译和测试
$ gcc myreadlink.c -o myreadlink
$ ./mysymlink ./test.txt hahatest
$ ./myreadlink hahatest
执行完后显示
./test.txt
2 总结
- 掌握这 4 个函数。
- unlink 函数不能删除目录,如果想删除目录,可以使用 rmdir 函数或者 ANSI C 中的 remove 函数。