系统调用函数——命令行工具readlink
在Linux和其他类Unix系统中,readlink是一个系统调用和命令行工具,用于读取符号链接(symbolic link)的值。符号链接是一种特殊类型的文件,它包含另一个文件或目录的路径作为其数据。换句话说,它是一个指向另一个文件的指针。
// readlink 是一个用于读取符号链接(symbolic link)目标路径的系统调用和命令行工具。
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
( 其中,pathname: 符号链接文件的路径;buf: 用于存储符号链接目标路径的缓冲区;bufsiz: 缓冲区的大小。函数返回,成功时:返回读取的字节数;失败时:返回-1,并设置errno )
命令行用例
readlink [选项] 文件-f, --canonicalize: 递归跟随符号链接,返回规范化的绝对路径
-e, --canonicalize-existing: 仅当目标存在时返回规范路径
-m, --canonicalize-missing: 即使目标不存在也返回规范路径
-n, --no-newline: 不输出末尾的换行符
-q, --quiet: 静默模式
-v, --verbose: 详细模式
基本用法及规范化路径如下:
# 创建符号链接
ln -s /usr/bin/python3 python_link# 读取符号链接目标
readlink python_link
# 输出: /usr/bin/python3#--------------------------------------------------------------# 创建多层符号链接
ln -s ../dir1/file.txt link1
ln -s link1 link2# 普通读取
readlink link2
# 输出: link1# 规范化读取
readlink -f link2
# 输出: /absolute/path/to/dir1/file.txt#---------------------------------------------------------------
# 脚本用例
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
echo "脚本所在目录: $SCRIPT_DIR"
项目中的用例
获取脚本真实路径: 在bash脚本中确定脚本自身的真实位置
解析符号链接: 查看软链接实际指向的目标
系统信息查询: 读取 /proc 文件系统中的符号链接信息
路径规范化: 将相对路径和符号链接转换为绝对路径
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main() {char buf[1024];ssize_t len;len = readlink("/proc/self/exe", buf, sizeof(buf)-1); // 获取当前执行程序的真实路径if (len != -1) {buf[len] = '\0';printf("当前程序路径: %s\n", buf);} else {perror("readlink");}return 0;
}
/proc/self: 指向当前进程的目录
/proc/self/exe: 是一个符号链接,指向当前进程对应的可执行文件的完整路径
/*在程序中定位资源文件*/
// 基于程序位置找到配置文件的路径
char exe_path[1024];
char config_path[1024];
readlink("/proc/self/exe", exe_path, sizeof(exe_path)-1);// 获取程序所在目录
char *dir = dirname(exe_path);
snprintf(config_path, sizeof(config_path), "%s/config.conf", dir);/*检测程序是否被符号链接调用*/
//# 假设创建了符号链接
//ln -s /usr/bin/real_program /usr/local/bin/shortcut// 在程序中可以检测是否通过符号链接调用
char actual_path[1024];
readlink("/proc/self/exe", actual_path, sizeof(actual_path)-1);if (strstr(actual_path, "shortcut") != NULL) {printf("通过快捷方式调用\n");
}
readlink("/proc/pid/exe")
获取指定进程的程序路径;进程监控工具
readlink("symlink_file")
解析普通符号链接;查看软链接指向
readlink -f path
规范化路径;脚本中获取绝对路径
// 获取程序所在目录,用于加载同级目录的配置文件
char* get_program_dir() {static char dir[1024];char exe_path[1024];ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path)-1);if (len == -1) return NULL;exe_path[len] = '\0';char *dir_end = strrchr(exe_path, '/');if (dir_end) {*dir_end = '\0';strcpy(dir, exe_path);return dir;}return NULL;
}
这个用法主要用于程序自我定位,在需要基于程序位置查找配置、资源文件或检测执行环境的场景中非常有用。readlink 不会自动在缓冲区末尾添加 null 字符。如果缓冲区太小,返回的路径会被截断。使用 -f 选项时,所有中间符号链接都会被递归解析。