gpt4 book ai didi

c - 如何将 readlink 与动态内存分配一起使用

转载 作者:IT王子 更新时间:2023-10-29 01:02:08 27 4
gpt4 key购买 nike

问题:

在 linux 机器上,我想读取链接的目标字符串。从文档中我找到了以下代码示例(没有错误处理):

struct stat sb;
ssize_t r;
char * linkname;

lstat("<some link>", &sb);
linkname = malloc(sb.st_size + 1);
r = readlink("/proc/self/exe", linkname, sb.st_size + 1);

问题是 sb.st_size 对我系统上的链接返回 0。

那么如何在此类系统上为 readline 动态分配内存?

非常感谢!


一种可能的解决方案:

供将来引用。使用 jilles 提出的观点:

struct stat sb;
ssize_t r = INT_MAX;
int linkSize = 0;
const int growthRate = 255;

char * linkTarget = NULL;

// get length of the pathname the link points to
if (lstat("/proc/self/exe", &sb) == -1) { // could not lstat: insufficient permissions on directory?
perror("lstat");
return;
}

// read the link target into a string
linkSize = sb.st_size + 1 - growthRate;
while (r >= linkSize) { // i.e. symlink increased in size since lstat() or non-POSIX compliant filesystem
// allocate sufficient memory to hold the link
linkSize += growthRate;
free(linkTarget);
linkTarget = malloc(linkSize);
if (linkTarget == NULL) { // insufficient memory
fprintf(stderr, "setProcessName(): insufficient memory\n");
return;
}

// read the link target into variable linkTarget
r = readlink("/proc/self/exe", linkTarget, linkSize);
if (r < 0) { // readlink failed: link was deleted?
perror("lstat");
return;
}
}
linkTarget[r] = '\0'; // readlink does not null-terminate the string

最佳答案

POSIX 表示符号链接(symbolic link)的 st_size 字段应设置为链接中路径名的长度(没有 '\0')。但是,Linux 上的 /proc 文件系统不符合 POSIX。 (它比这一个有更多的违规行为,例如一次读取某些文件时一个字节。)

您可以分配一个特定大小的缓冲区,尝试 readlink() 并在缓冲区不够大时使用更大的缓冲区重试(readlink() 返回为缓冲区中的字节数),直到缓冲区足够大。

或者,您可以使用 PATH_MAX 并破坏系统的可移植性,因为它不是编译时常量或路径名可能比它长(POSIX 允许)。

关于c - 如何将 readlink 与动态内存分配一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385386/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com