symlink、readlink用来创建、读取软链接
symlink()系统调用会针对由filepath所指定的路径名创建一个新的符号链接----linnpath。(如果想要移除符号链接,需要调用unlink())
NAME
symlink, symlinkat - make a new name for a file
SYNOPSIS
#include <unistd.h>
int symlink(const char *target, const char *linkpath);
#include <fcntl.h> /* Definition of AT_* constants */
#include <unistd.h>
int symlinkat(const char *target, int newdirfd, const char *linkpath);
- 如果linkpath中给定的路径名已经存在,那么调用将失败(且将 errno 置为 EEXIST)
- target指定路径名,可以是绝对路径,也可以是相对路径。
由target所命名的文件或者目录在调用时无需存在。如果不存在或者调用之后被删除了,linkpath()将成为“悬空链接”,其他系统调用试图对其进行解引用操作都将出错(通常错误号为 ENOENT)
如果指定一符号链接这为open()调用的pathname参数,那么将打开链接指向的文件。有时,想要获取链接本身的内容,这是可以使用readlink()调用,将符号链接字符串的一份副本置于buffer指向的字符数组中。
SYNOPSIS
#include <unistd.h>
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
- bufsiz是一个整形操作,用以告知readlink()调用buf中的可用字节数
- 如果一切顺利,readlink()将返回实际放入 buffer 中的字节数
- 若链接长度超过 bufsiz,则置于 buffer 中的是经截断处理的字符串
- 由于 buffer 尾部并未放置终止空字符,故而也无法分辨 readlink()所返回的字符串到底是经过截断处理,还是恰巧将 buffer 填满。验证后者的方法之一是重新分配一块更大的 buffer,并再次调用readlink()。另外,还可以将 pathname 的长度定义为PATH_MAX,该常量定义了程序可拥有的最长路径名长度。