symlink 函数和 readlink 函数主要是针对符号链接文件的操作。symlink 函数用来创建符号链接文件,和 link 文件是对应的。readlink 函数用来读取链接文件本身的内容(也就是符号链接指向的文件的文件名)。
头文件: #include <unistd.h>
函数原型:
int symlink(const char* actualpath,const char* sympath);
int symlinkat(const char *actualpath,int fd,const char *sympath);
如果sympath参数指定的是绝对路径或者fd参数设置了AT_FDCWD值,那么symlinkat就等同于symlink函数。
函数参数:
oldpath:源文件的路径名
newpath:符号链接文件的路径名
返回值:
调用成功时返回 0
调用失败时返回 -1
错误代码:
1、EPERM 参数actualpath 与sympath所指的文件系统不支持符号连接。
2、EROFS 欲测试写入权限的文件存在于只读文件系统内。
3、EFAULT 参数actualpath 或sympath 指针超出可存取内存空间。
4、ENAMETOOLONG 参数actualpath 或sympath 太长。
5、ENOMEM 核心内存不足。
6、EEXIST 参数newpath 所指的文件名已存在。
7、EMLINK 参数actualpath 所指的文件已达到最大连接数目。
8、ELOOP 参数sympath 有过多符号连接问题。
9、ENOSPC 文件系统的剩余空间不足。
10、EIO I/O 存取错误。
定义函数:
int readlink(const char *path, char *buf, size_t bufsiz);
int readlinkat(int fd,const char* path,char *buf,size_t bufsize);
当pathname参数指定的是绝对路径名或者fd参数的值为AT_FDCWD,readlinkat函数的行为与readlink相同。但是,如果fd参数是一个打开目录的有效文件描述符并且pathname参数是相对路径名,则readlinkat计算相对于由fd代表的打开目录的路径。
这两个函数组合了open、read和close的所有操作。如果函数成功执行,则返回读入buf的字节数。在buf中返回的符号链接的内容不以null字符终止。
函数参数;
path:读取的符号链接文件的路径名
buf:用来存储读出的文件内容
bufsiz:想要读取的字节数
返回值 :执行成功则传符号连接所指的文件路径字符串,失败返回-1, 错误代码存于errno
错误代码:
EACCESS 取文件时被拒绝,权限不够
EINVAL 参数bufsiz为负数
EIO O存取错误
ELOOP 欲打开的文件有过多符号连接问题
ENAMETOOLONG 参数path的路径名称太长
ENOENT 参数path所指定的文件不存在
ENOMEM 核心内存不足
ENOTDIR 参数path路径中的目录存在但却非真正的目录
获取当前exe的路径
#include <stdio.h>
#include <unistd.h>
char * get_exe_path( char * buf, int count)
{
int i;
int rslt = readlink("/proc/self/exe", buf, count - 1);
if (rslt < 0 || (rslt >= count - 1))
{
return NULL;
}
buf[rslt] = '\0';
for (i = rslt; i >= 0; i--)
{
printf("buf[%d] %c\n", i, buf[i]);
if (buf[i] == '/')
{
buf[i + 1] = '\0';
break;
}
}
return buf;
}
int main(int argc, char ** argv)
{
char path[1024];
printf("%s\n", get_exe_path(path, 1024));
return 0;
}
symlinkat和readlinkat函数的实例程序如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <dirent.h>
#define BUFFSIZE 1024
int main(int argc,char *argv[])
{
if(argc != 4){
printf("param too few\n");
exit(EXIT_FAILURE);
}
char buf[BUFFSIZE];
ssize_t sz;
DIR *dp;
int fd;
//获取相对路径名返回的文件描述符fd
if((dp = opendir(argv[2])) == NULL){
perror("opendir");
exit(EXIT_FAILURE);
}
if((fd = dirfd(dp)) < 0){
perror("dirfd");
exit(EXIT_FAILURE);
}
//创建符号链接
if(symlinkat(argv[1],fd,argv[3]) < 0){
perror("symlinkat");
exit(EXIT_FAILURE);
}
//读取符号链接
memset(buf,0,sizeof(buf));
if((sz = readlinkat(fd,argv[3],buf,sizeof(buf))) < 0){
perror("readlinkat");
exit(EXIT_FAILURE);
}
printf("buf:%s,length:%u\n",buf,(unsigned int)sz);
close(fd);
return 0;
}
头文件: #include <unistd.h>
函数原型:
int symlink(const char* actualpath,const char* sympath);
int symlinkat(const char *actualpath,int fd,const char *sympath);
如果sympath参数指定的是绝对路径或者fd参数设置了AT_FDCWD值,那么symlinkat就等同于symlink函数。
函数参数:
oldpath:源文件的路径名
newpath:符号链接文件的路径名
返回值:
调用成功时返回 0
调用失败时返回 -1
错误代码:
1、EPERM 参数actualpath 与sympath所指的文件系统不支持符号连接。
2、EROFS 欲测试写入权限的文件存在于只读文件系统内。
3、EFAULT 参数actualpath 或sympath 指针超出可存取内存空间。
4、ENAMETOOLONG 参数actualpath 或sympath 太长。
5、ENOMEM 核心内存不足。
6、EEXIST 参数newpath 所指的文件名已存在。
7、EMLINK 参数actualpath 所指的文件已达到最大连接数目。
8、ELOOP 参数sympath 有过多符号连接问题。
9、ENOSPC 文件系统的剩余空间不足。
10、EIO I/O 存取错误。
定义函数:
int readlink(const char *path, char *buf, size_t bufsiz);
int readlinkat(int fd,const char* path,char *buf,size_t bufsize);
当pathname参数指定的是绝对路径名或者fd参数的值为AT_FDCWD,readlinkat函数的行为与readlink相同。但是,如果fd参数是一个打开目录的有效文件描述符并且pathname参数是相对路径名,则readlinkat计算相对于由fd代表的打开目录的路径。
这两个函数组合了open、read和close的所有操作。如果函数成功执行,则返回读入buf的字节数。在buf中返回的符号链接的内容不以null字符终止。
函数参数;
path:读取的符号链接文件的路径名
buf:用来存储读出的文件内容
bufsiz:想要读取的字节数
返回值 :执行成功则传符号连接所指的文件路径字符串,失败返回-1, 错误代码存于errno
错误代码:
EACCESS 取文件时被拒绝,权限不够
EINVAL 参数bufsiz为负数
EIO O存取错误
ELOOP 欲打开的文件有过多符号连接问题
ENAMETOOLONG 参数path的路径名称太长
ENOENT 参数path所指定的文件不存在
ENOMEM 核心内存不足
ENOTDIR 参数path路径中的目录存在但却非真正的目录
获取当前exe的路径
#include <stdio.h>
#include <unistd.h>
char * get_exe_path( char * buf, int count)
{
int i;
int rslt = readlink("/proc/self/exe", buf, count - 1);
if (rslt < 0 || (rslt >= count - 1))
{
return NULL;
}
buf[rslt] = '\0';
for (i = rslt; i >= 0; i--)
{
printf("buf[%d] %c\n", i, buf[i]);
if (buf[i] == '/')
{
buf[i + 1] = '\0';
break;
}
}
return buf;
}
int main(int argc, char ** argv)
{
char path[1024];
printf("%s\n", get_exe_path(path, 1024));
return 0;
}
symlinkat和readlinkat函数的实例程序如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <dirent.h>
#define BUFFSIZE 1024
int main(int argc,char *argv[])
{
if(argc != 4){
printf("param too few\n");
exit(EXIT_FAILURE);
}
char buf[BUFFSIZE];
ssize_t sz;
DIR *dp;
int fd;
//获取相对路径名返回的文件描述符fd
if((dp = opendir(argv[2])) == NULL){
perror("opendir");
exit(EXIT_FAILURE);
}
if((fd = dirfd(dp)) < 0){
perror("dirfd");
exit(EXIT_FAILURE);
}
//创建符号链接
if(symlinkat(argv[1],fd,argv[3]) < 0){
perror("symlinkat");
exit(EXIT_FAILURE);
}
//读取符号链接
memset(buf,0,sizeof(buf));
if((sz = readlinkat(fd,argv[3],buf,sizeof(buf))) < 0){
perror("readlinkat");
exit(EXIT_FAILURE);
}
printf("buf:%s,length:%u\n",buf,(unsigned int)sz);
close(fd);
return 0;
}