21-link系列的函数

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 函数。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值