linux下readlink函数详解linux下readlink函数详解
相关函数: stat, lstat, symlink
表头⽂件: #include <unistd.h>
定义函数:int  readlink(const  char *path,  char *buf, size_t  bufsiz);
函数说明:readlink()会将参数path的符号连接内容到参数buf所指的内存空间,返回的内容不是以NULL作字符串结尾,但会将字符串的字符数返回。若参数bufsiz⼩于符号连接的内容长度,过长的内容会被截断
返回值:执⾏成功则传符号连接所指的⽂件路径字符串,失败返回-1,错误代码存于errno
错误代码:
EACCESS                  取⽂件时被拒绝,权限不够
EINVAL                    参数bufsiz为负数
EIO                        O存取错误
ELOOP                    欲打开的⽂件有过多符号连接问题
ENAMETOOLONG      参数path的路径名称太长
ENOENT                  参数path所指定的⽂件不存在
ENOMEM                  核⼼内存不⾜
ENOTDIR                  参数path路径中的⽬录存在但却⾮真正的⽬录
例⼀:
#include <stdio.h>
#include <unistd.h>
#define PATH_MAX 1024
char * get_exe_path()
{
static char buf[PATH_MAX];
int i;
库函数printf详解int rslt = readlink("/proc/self/exe", buf, PATH_MAX);
if (rslt < 0 || rslt >= PATH_MAX)
{
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)
{
printf("%s\n", get_exe_path());
return 0;
}
例⼆:(个⼈感觉这个程序⽐较合理, 推荐)
#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;
}