link 系列的函数,主要是用来创建链接,删除链接的。主要有 link、symlink、unlink、readlink 这几个。
它们的功能如下:
函数功能link创建硬链接symlink创建软链接(符号链接)unlink删除硬链接或软链接readlink读取软链接文件自身内容(不是所指向的文件内容)在此之前先创建测试文件 test.txt
$ echo hello > test.txt $ ls -l test.txt -rw-rw-r-- 1 allen allen 6 12月 2 14:26 test.txtlink 函数专门用来创建硬链接的,功能和 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 的内容完全一样。
该函数用来创建符号链接,功能和 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.
对于硬链接来说,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.
该函数用于读取符号链接文件自身内容,而不是符号链接所指向的文件内容。
函数原型 // 输入参数 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