c - 检索符号链接(symbolic link)的路径

标签 c linux path size symlink

我想将符号链接(symbolic link)指向的文件路径存储到 bufff 中。这适用于我当前使用 readlink 的实现,但它获取了我不需要的额外数据,因为我的 bufsize 是任意值的。我不确定如何根据符号链接(symbolic link)指向的路径调整它的大小,因为我所拥有的只是符号链接(symbolic link)的路径。这存储在 path 中,它是一个字符数组。如果我只有符号链接(symbolic link)的路径,我怎么知道用链接的直接路径字符串的大小来调整 bufff 的大小?

char bufff[100];
size_t bufsize = 100;
readlink(path,bufff,bufsize);

最佳答案

readlink() 函数返回复制到缓冲区的字节数,没有最后的 \0。这意味着如果您使用 100 字节的缓冲区调用 readlink() 并且 readlink() 返回 100,则您需要更多空间(即使路径正好是 100 字节,你仍然需要至少 1 个字节来在末尾添加一个空字符。

解决方案是在循环中增加缓冲区:

size_t bufsize = 255; /* Initial buffer size */
ssize_t result;
char* buf = malloc(bufsize); /* Initial buffer allocation */
while ((result = readlink(path, buf, bufsize)) >= bufsize) {
    /* We double the buffer size, so next call should succeed ! */
    bufsize *= 2;
    buf = realloc(buf, bufsize);
}
buf[result] = '\0';

警告:这只是一个示例,我们不会检查 readlink 是否在出错时返回 -1。 mallocrealloc 也一样。您应该检查现实世界中的错误。

关于c - 检索符号链接(symbolic link)的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25816944/

相关文章:

c - 陷入重写 strcpy 的困境

java - TaskManager for linux - Java Swing 在 Linux 上工作吗?

java - 在 Mac 上设置 JAVA_HOME 路径时出现问题?

path - 通过有向图比较有向路径相似度的算法

node.js - 如何从路由器文件引用 "public"静态文件夹中的文件夹?

c - 在 2 个文件 .c 中包含相同的 header

c++ - C/C++ 中的 const 数组和静态 const 数组有什么区别

c - 将 C 代码放入另一个文件中

linux - 获取完整的当前 crontab 行,并为每行创建唯一的结果电子邮件 header (发件人、主题等)

c - SO_MARK有效值