21-link系列的函数

来源:互联网 发布:算法流程图怎么写 编辑:程序博客网 时间:2024/06/05 17:03

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 122 14:26 test.txt

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 的内容完全一样。

该函数用来创建符号链接,功能和 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

2 总结

  • 掌握这 4 个函数。
  • unlink 函数不能删除目录,如果想删除目录,可以使用 rmdir 函数或者 ANSI C 中的 remove 函数。
0 0
原创粉丝点击