readlink

 

readlink命令

标签: ubuntulinux工具file
 分类:
 

readlink是Linux系统中一个常用工具,主要用来找出符号链接所指向的位置。

在Ubuntu系统中执行以下命令:

[plain] view plaincopy
 
  1. $ readlink --help  

可以查看readlink命令的帮助信息,或者执行

[plain] view plaincopy
 
  1. $ man readlink  
查看帮助手册。

 

从帮助信息中可以得到readlink命令的用途描述:

输出符号链接值或者权威文件名

英文为:

print value of a symbolic link or canonical file name

 

举例:

系统中的awk命令到底是执行哪个可以执行文件呢?

[plain] view plaincopy
 
  1. $ readlink /usr/bin/awk  
  2. /etc/alternatives/awk  ----> 其实这个还是一个符号连接  
  3. $ readlink /etc/alternatives/awk  
  4. /usr/bin/gawk  ----> 这个才是真正的可执行文件  

-f 选项:

-f 选项可以递归跟随给出文件名的所有符号链接以标准化,除最后一个外所有组件必须存在。

简单地说,就是一直跟随符号链接,直到直到非符号链接的文件位置,限制是最后必须存在一个非符号链接的文件。

[plain] view plaincopy
 
  1. $ readlink -f /usr/bin/a

 

 

linux关于readlink函数获取运行路径的小程序

http://blog.csdn.net/djzhao/article/details/8178375

 

相关函数: stat, lstat, symlink

表头文件: #include <unistd.h>

定义函数:int  readlink(const  char *path,  char *buf, size_t  bufsiz);

函数说明:readlink()会将参数path的符号链接内容存储到参数buf所指的内存空间,返回的内容不是以\000作字符串结尾,但会将字符串的字符数返回,这使得添加\000变得简单。若参数bufsiz小于符号连接的内容长度,过长的内容会被截断,如果 readlink 第一个参数指向一个文件而不是符号链接时,readlink 设 置errno 为 EINVAL 并返回 -1。 readlink()函数组合了open()、read()和close()的所有操作。

 

返回值   :执行成功则传符号连接所指的文件路径字符串,失败返回-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;

 

/*  /proc/self/exe -> /a/b/c*/

    int rslt = readlink("/proc/self/exe", buf, PATH_MAX);// buf返回"/a/b/c"

 

    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;

}

 

posted on 2017-01-09 10:54  一切崆蒙  阅读(2442)  评论(0编辑  收藏  举报