问题:

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

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

那么如何在这样的系统上为readline动态分配内存?

非常感谢!


一种可能的解决方案:

以供将来参考。使用jilles提出的观点: 通用标签

有帮助吗?

解决方案

POSIX表示,符号链接的st_size字段应设置为链接中路径名的长度(不包含'\0')。但是,Linux上的/proc文件系统不兼容POSIX。(它不仅仅具有这种违规性,例如一次读取一个字节时读取某些文件。)

您可以分配一定大小的缓冲区,如果缓冲区不够大(readlink()返回的字节数与缓冲区中的字节数相等),请尝试使用readlink()并尝试使用更大的缓冲区,直到缓冲区足够大。

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

其他提示

其他答案没有提及,但是有一个realpath函数,该函数正是您想要的,由POSIX.1-2001指定。 通用标签

来自联机帮助页:

realpath()扩展所有符号链接并解析对 /./、/../以及以零结尾的字符串中的其他“ /”字符 按路径生成规范化的绝对路径名。

realpath还可为您处理动态内存分配。再次,摘录于联机帮助页:

如果将resolve_path指定为NULL,则realpath()使用 malloc(3)分配最多PATH_MAX个字节的缓冲区来保存 解析路径名,并返回指向此缓冲区的指针。呼叫者,召集者 应该使用free(3)释放该缓冲区。

作为一个简单完整的示例: 通用标签

st_size不能在/ proc上给出正确的答案。

相反,您可以malloc PATH_MAX或pathconf(_PC_PATH_MAX)字节。对于大多数情况,这应该足够了。如果您希望能够处理更长的路径,则可以在循环中调用readlink,并在readlink返回值指示缓冲区太短时重新分配缓冲区。请注意,尽管许多其他POSIX函数只是假设PATH_MAX就足够了。

我对st_size为什么为零感到困惑。每个POSIX:

对于符号链接,当与文件类型宏一起使用时,st_mode成员应包含有意义的信息。未指定st_mode中的文件模式位。结构成员st_ino,st_dev,st_uid,st_gid,st_atim,st_ctim和st_mtim应该具有有意义的值,并且st_nlink成员的值应设置为符号链接的(硬)链接数。 st_size成员的值应设置为符号链接中包含的路径名的长度,不包括任何终止的空字节。

来源: http://pubs.opengroup.org/onlinepubs/9699919799/ functions / lstat.html

如果st_size不起作用,我认为您唯一的选择是动态分配缓冲区,并保持更大的大小,只要readlink的返回值等于缓冲区大小即可。

readlink(2)的联机帮助页表示,如果缓冲区太小,它将默默地截断。如果您确实想不受限制(不介意为额外工作支付一些费用),则可以从给定的分配大小开始,并不断增加分配大小,然后重试readlink调用。当下一次对readlink的调用返回与上次迭代相同的字符串时,您可以停止增加缓冲区。

您到底要使用lstat实现什么?

您只需使用以下内容即可获得目标 通用标签

如果您试图获取文件名大小的长度,我认为st_size并不是正确的变量……但这可能是一个不同的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top