一、symlink函数
symlink函数用于创建一个符号链接文件。函数原型:
#include <unistd.h>
int symlink(const char *actualpath, const char *sympath);
返回值:如果创建成功则返回0,否则返回-1
参数:
actualpath 要指向的路径
sympath 被创建的新目录项路径
symlink的本质是相当于creat一个文件sympath,并把actualpath的值(字符串)写进文件sympath,同时把文件标识为符号连接类型。
可见,symlink和link函数虽然都产生一个叫作链接的东西,但二者完全是两码事。(参阅《4.15 link、unlink函数与文件目录项》)
实例 x.4.17.1.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
char actualpath[] = "/tmp/myfile";
char sympath[] = "/tmp/mysymlink";
if (symlink(actualpath, sympath) == -1)
printf("symlink error for %s\n", sympath);
else
printf("symlink succeed for %s\n", sympath);
return 0;
}
编译与执行:
[root@localhost unixc]# rm -f /tmp/myfile /tmp/mysymlink
[root@localhost unixc]# ls -l /tmp/myfile /tmp/mysymlink
ls: cannot access /tmp/myfile: No such file or directory
ls: cannot access /tmp/mysymlink: No such file or directory
[root@localhost unixc]# echo "123456789" > /tmp/myfile
[root@localhost unixc]# ls -l /tmp/myfile /tmp/mysymlink
ls: cannot access /tmp/mysymlink: No such file or directory
-rw-r--r--. 1 root root 10 Nov 5 02:36 /tmp/myfile
[root@localhost unixc]# cc x.4.17.1.c
[root@localhost unixc]# ./a.out
symlink succeed for /tmp/mysymlink
[root@localhost unixc]# ls -l /tmp/myfile /tmp/mysymlink
-rw-r--r--. 1 root root 10 Nov 5 02:36 /tmp/myfile
lrwxrwxrwx. 1 root root 11 Nov 5 02:36 /tmp/mysymlink -> /tmp/myfile
[root@localhost unixc]# rm -f /tmp/myfile /tmp/mysymlink
[root@localhost unixc]# ls -l /tmp/myfile /tmp/mysymlink
ls: cannot access /tmp/myfile: No such file or directory
ls: cannot access /tmp/mysymlink: No such file or directory
[root@localhost unixc]# ./a.out
symlink succeed for /tmp/mysymlink
[root@localhost unixc]# ls -l /tmp/myfile /tmp/mysymlink
ls: cannot access /tmp/myfile: No such file or directory
lrwxrwxrwx. 1 root root 11 Nov 5 02:37 /tmp/mysymlink -> /tmp/myfile
[root@localhost unixc]#
分析:
(1)先删除掉/tmp/myfile和/tmp/mysymlink
(2)echo一个/tmp/myfile
(3)编辑执行,成功执行并创建了一个符号链接:lrwxrwxrwx. 1 root root 11 Nov 5 02:36 /tmp/mysymlink -> /tmp/myfile
(4)再删除掉/tmp/myfile和/tmp/mysymlink,让/tmp/myfile的情况下symlink看看
(5)结果在/tmp/myfile不存在的情况下symlink成功了。
二、readlink函数
readlink函数用于读取符号链接文件本身数据(一个字符串,用来表达要指向的文件的路径),而不是指向的文件的数据。也就是取出调用symlink函数时写入的actualpath。
函数原型:
#include <unistd.h>
ssize_t readlink(const char* restrict pathname, char *restrict buf, size_t bufsize);
返回值:如果读取成功则返回实际读到的字节数,否则返回-1
参数:
pathname 符合链接文件的路径
buf 存放取出数据的指针
bufsize 要取出的数据的字节数
readlink函数实际上组合了open、read和close的所有操作。函数不会在buf的最后自动加null字符终止符,所以调用printf输出之前要添上去。
实例 x.4.17.2.c
#include <stdio.h>
#include <unistd.h>
#define BUFFSIZE 1024
int main(void)
{
char sympath[] = "/tmp/mysymlink";
ssize_t size;
char buf[BUFFSIZE];
if ((size = readlink(sympath, buf, BUFFSIZE)) < 0) {
printf("readlink error for %s", sympath);
return 1;
} else {
buf[size] = '\0';
printf("%s\n",buf);
}
return 0;
}
编译与执行:
[root@localhost unixc]# rm -f /tmp/mysymlink
[root@localhost unixc]# cc x.4.17.1.c -o mysyml
[root@localhost unixc]# ./mysyml
symlink succeed for /tmp/mysymlink
[root@localhost unixc]# ls -l /tmp/mysymlink
lrwxrwxrwx. 1 root root 11 Nov 5 03:05 /tmp/mysymlink -> /tmp/myfile
[root@localhost unixc]# cc x.4.17.2.c
[root@localhost unixc]# ./a.out
/tmp/myfile
[root@localhost unixc]#
分析:
(1)把实例 x.4.17.1.c编译为 mysyml,然后调用./mysyml创建一个符号链接
(2)编译本例,执行./a.out