C语言使用readlink()获取符号链接指向的文件名的实现问题
readlink获取符号链接目标的实现方法
首先明确核心逻辑:readlink的返回值是成功读取到的目标路径字节数,并非直接返回路径字符串,路径内容会写入你提前传入的缓冲区中。另外readlink不会自动给缓冲区追加字符串结束符\0,需要手动处理,否则会出现乱码。
还有一个前置注意点:你获取文件元数据时必须使用lstat()而非stat(),stat()会自动跟随符号链接获取目标文件的属性,只有lstat()可以拿到符号链接本身的属性,才能通过S_ISLNK(info.st_mode)判断当前文件是否为符号链接。
你可以把代码的if-else块修改为如下内容:
#include <limits.h> // 需引入该头文件使用PATH_MAX // 前面的打印逻辑保持不变 if(!opts.link){ // 未传入-link参数 printf(" %ld %s\n", info.st_size, tokens[2]); } else{ // 传入-link参数 char name[PATH_MAX] = {0}; ssize_t read_len = readlink(tokens[2], name, sizeof(name)-1); // 预留1位存储结束符 if (read_len < 0) { // readlink调用失败(文件不是符号链接、无权限等场景),按原有格式打印 printf(" %ld %s\n", info.st_size, tokens[2]); } else { name[read_len] = '\0'; // 手动添加字符串结束符 printf(" %ld %s -> %s\n", info.st_size, tokens[2], name); } }
内容的提问来源于stack exchange,提问作者rascadux
相关产品推荐
相关产品推荐

