2012-03-15 14:06 3674人阅读 评论(1) 收藏 举报
 分类:
linux系统(184)  C语言(92) 

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

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

  1. $ readlink --help

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

  1. $ man readlink

查看帮助手册。

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

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

英文为:

print value of a symbolic link or canonical file name

举例:

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

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

-f 选项:

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

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

  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;

}

readlink的更多相关文章

  1. 【转载】利用shell脚本获取一个文件的绝对路径readlink

    转载自:http://os.chinaunix.net/a2007/1118/976/000000976787.shtml #! /bin/bash echo "Path to $(base ...

  2. 文件和目录之symlink和readlink函数

    symlink函数创建一个符号链接. #include <unistd.h> int symlink( const char *actualpath, const char *sympat ...

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

    http://blog.csdn.net/djzhao/article/details/8178375   相关函数: stat, lstat, symlink表头文件: #include <u ...

  4. inux关于readlink函数获取运行路径的小程序

    inux关于readlink函数获取运行路径的小程序   相关函数: stat, lstat, symlink 表头文件: #include <unistd.h> 定义函数:int  re ...

  5. Liunx readlink命令

    readlink命令 分类: Shell 2013-07-13 16:41 417人阅读 评论(0) 收藏 举报 readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置. 在 ...

  6. linux命令readlink

    readlink,从字面意思就可以看出来,输出符号链接值或者权威文件名. openwrt 下的readlink命令参数如下: root@hbg:/# readlink  --helpBusyBox v ...

  7. readlink 获取进程的绝对路径

    readlink可以获取exe所在的路径(直接和进程关联);无法获得so的路径,so路径可以用dladdr,参考另一篇文章linux系统中有个符号链接:/proc/self/exe 它代表当前程序,所 ...

  8. readlink: command not found 解决方案

    /c/Program Files (x86)/Yarn/bin/yarn: line 3: readlink: command not found 用gitbash运行yarn时提示这个错误,但没有直 ...

  9. readlink 命令

    在Linux中readlink命令的作用是:输出符号链接值或权威文件名(通常使用的是-f参数) 格式:readlink [选项]... 文件 参数:   -f, --canonicalize 递归跟随 ...

随机推荐

  1. Deep Learning 学习随记(八)CNN(Convolutional neural network)理解

    前面Andrew Ng的讲义基本看完了.Andrew讲的真是通俗易懂,只是不过瘾啊,讲的太少了.趁着看完那章convolution and pooling, 自己又去翻了翻CNN的相关东西. 当时看讲 ...

  2. 工欲善其事必先利其器之Xcode高效插件和舒适配色

    功能强大的Xcode再配上高效的插件,必会让你的开发事半功倍.直接进入正题. Xcode插件安装方式: 1.github下载插件然后用xcode打开运行一遍,然后重启xcode. 2.安装插件管理Al ...

  3. 详解函数声明VS函数表达式

    函数声明 比方如下:1.我们以一个完整的语句以function开头,不加任何东西. 2.有一个函数名(add) 3.参数可带可不带(x,y) 4.有一个数体 满足以上要求的我们统称为函数声明! 附加小 ...

  4. 基于php-fpm的配置详解[转载]

    php自带php-fpm/usr/local/php/etc/php-fpm.confpid = run/php-fpm.pidpid设置,默认在安装目录中的var/run/php-fpm.pid,建 ...

  5. ArcGis Engine 读取自定义prj坐标系文件时,中文名称乱码

    今天测试时发现使用ArcMap自定义一个坐标系,将坐标系名称设置为中文,基准面名称选择为自定义后,然后保存成prj文件. 在自己的程序中读取该prj文件后,发现ISpatialReference 对象 ...

  6. coroutine协程

    如果你接触过lua这种小巧的脚本语言,你就会经常接触到一个叫做协程的神奇概念.大多数脚本语言都有对协程不同程度的支持.但是大多编译语言,如C/C++,根本就不知道这样的东西存在.当然也很多人研究如何在 ...

  7. study note--(Education)

    some good temoplates: A child's education has never been about learning information and basic skills ...

  8. BZOJ 3196 二逼平衡树

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的 ...

  9. Java 可视化垃圾回收

    基础 当谈到释放不再使用的内存,垃圾回收已经在很大程度上取代了早期技术,比如手动内存管理和引用计数. 这是件好事,因为内存管理令人厌烦,学究式地簿记是计算机擅长的,而不是人擅长的.在这方面,语言的运行 ...

  10. yum仅下载RPM包不安装

    http://www.ttlsa.com/linux/howto-yum-download-rpm-without-install/