内容简介:readlink既是一个linux下的命令,又是Linux系统编程中的一个函数,因此本文分两部分介绍readlink.readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置。在Ubuntu系统中执行以下命令:
readlink既是一个 linux 下的命令,又是Linux系统编程中的一个函数,因此本文分两部分介绍readlink.
readlink命令
readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置。
在Ubuntu系统中执行以下命令:
$ readlink --help
可以查看readlink命令的帮助信息,或者执行$ man readlink
查看帮助手册。从帮助信息中可以得到readlink命令的用途描述:
输出符号链接值或者权威文件名
英文为:
print value of a symbolic link or canonical file name
举例:
系统中的awk命令到底是执行哪个可以执行文件呢?
$ readlink /usr/bin/awk
/etc/alternatives/awk ----> 其实这个还是一个符号连接
$ readlink /etc/alternatives/awk
/usr/bin/gawk ----> 这个才是真正的可执行文件
-f 选项:-f 选项可以递归跟随给出文件名的所有符号链接以标准化,除最后一个外所有组件必须存在。
简单地说,就是一直跟随符号链接,直到直到非符号链接的文件位置,限制是最后必须存在一个非符号链接的文件。
$ readlink -f /usr/bin/awk
/usr/bin/gawkreadlink函数
readlink函数 ,在linux c系统编程中用于读取符号链接,man7.org中的一个例子如下:
#include <sys/types.h> #include <sys/stat.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { struct stat sb; char *buf; ssize_t nbytes, bufsiz; if (argc != 2) { fprintf(stderr, "Usage: %s <pathname>\n", argv[0]); exit(EXIT_FAILURE); } if (lstat(argv[1], &sb) == -1) { perror("lstat"); exit(EXIT_FAILURE); } /* Add one to the link size, so that we can determine whether the buffer returned by readlink() was truncated. */ bufsiz = sb.st_size + 1; /* Some magic symlinks under (for example) /proc and /sys report 'st_size' as zero. In that case, take PATH_MAX as a "good enough" estimate. */ if (sb.st_size == 0) bufsiz = PATH_MAX; buf = malloc(bufsiz); if (buf == NULL) { perror("malloc"); exit(EXIT_FAILURE); } nbytes = readlink(argv[1], buf, bufsiz); if (nbytes == -1) { perror("readlink"); exit(EXIT_FAILURE); } printf("'%s' points to '%.*s'\n", argv[1], (int) nbytes, buf); /* If the return value was equal to the buffer size, then the the link target was larger than expected (perhaps because the target was changed between the call to lstat() and the call to readlink()). Warn the user that the returned target may have been truncated. */ if (nbytes == bufsiz) printf("(Returned buffer may have been truncated)\n"); free(buf); exit(EXIT_SUCCESS); }
一种根据可执行文件的路径,拼接相对路径的方法
#include <stdio.h> #include <limits.h> /*PATH_MAX*/ #include <string.h> #include <assert.h> char g_execpath[PATH_MAX]; /* 可执行文件的所有目录 */ static void get_exec_path() { int r; if ((r = readlink("/proc/self/exe", g_execpath, sizeof(g_execpath) - 1)) != -1) { char *p; assert((size_t)r < sizeof(g_execpath)); g_execpath[r] = 0; if ((p = strrchr(g_execpath, '/'))) { *p = 0; } else { g_execpath[0] = '/'; g_execpath[1] = 0; } } else { g_execpath[0] = '/'; g_execpath[1] = 0; } } /* 路径转换 */ void relative_path_transform(const char *dir, char *out, size_t outsize) { assert(dir && out && outsize); if (!g_execpath[0]) { get_exec_path(); } if (*dir == '@') { snprintf(out, outsize, "%s%s", g_execpath, dir + 1); } else { snprintf(out, outsize, "%s", dir); } } #define APP_PROCESS_PATH "@/app" #define ABS_PROCESS_PATH "/root/app" int main() { /*相对路径使用readlink获取程序路径地址*/ char proxy_path[PATH_MAX] = { 0 }; (void)relative_path_transform(APP_PROCESS_PATH, proxy_path, PATH_MAX); printf("%s\n",proxy_path); /*绝对路径直接打印路径信息*/ char abs_proxy_path[PATH_MAX] = { 0 }; (void)relative_path_transform(ABS_PROCESS_PATH, abs_proxy_path, PATH_MAX); printf("%s\n",abs_proxy_path); return 0; }
以上所述就是小编给大家介绍的《readlink》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML网页设计参考手册
张金霞 / 清华大学 / 2006-9 / 39.00元
本书由最基本的HTML语法开始讲解网页设计的基础技术,详细介绍了各种网页制作的标记;然后介绍如何运用CSS控制网页画面中文字与图片的样式;接下来讲解了JavaScript语言与网页特效的制作;最后以应用最广泛的Drcamweaver为例,介绍网页设计的方法。在讲解中配有大量范例,使读者在实际操作中学习制作网页。 HTML语言是制作网页的基础语言。作为一个网页制作爱好者或者专业的网......一起来看看 《HTML网页设计参考手册》 这本书的介绍吧!