gpt4 book ai didi

c -/proc/%u/fd/%u 的大小是多少

转载 作者:行者123 更新时间:2023-12-02 09:38:16 25 4
gpt4 key购买 nike

我需要为 /proc/%u/fd/%u 分配多少大小?
strace code他们分配了 char path[sizeof("/proc/%u/fd/%u") + 2 * sizeof(int)*3];我不明白 calc ,他们是如何计算这个尺寸的?

最佳答案

这似乎是一种相当奇怪的方法,但它确实有效(见下文)。他们假设您只需要 2 + 3n进程 ID 和文件描述符的字符,其中 n是整数中的字节数( 2 因为 %u 将被替换,3n 因为 sizeof 组件)。
它确实有效,按照以下 chars/int值(对于 8 位 char)、公式结果和最大值 unsigned int这将来自它:

chars/int  sizeof(int) * 3 + 2       max value
--------- ------------------- --------------------
1 5 255 (3/5 needed)
2 8 65535 (5/8 needed)
4 14 4294967296 (10/14)
8 26 18446744073709551616 (20/26)
16 50 3.3 * 10^38 (39/50)
您可以看到分配的存储与所需的存储保持一致,您可以轻松使用:
char path[sizeof("/proc/%u/fd/%u") + 2 * sizeof(int) * 3 - 2];
// add this ^^^
它也适用于 char大小也超过八位,因为将值中的位加倍最多会使十进制位数加倍(表格显示了所需的大小: 3, 5, 10, 20, 39, ... )。那,结合事实, int大小也加倍,这意味着总是有足够的空间。

你可能认为,为了安全和可移植性,你实际上可以分别从 /proc/sys/kernel/pid_max 得到最大 PID 和进程文件描述符。和 /proc/<pid>/limits (以编程方式)并使用它来动态分配足够的空间来保存信息:
pax:~> cat /proc/sys/kernel/pid_max
32768
pax:~> cat /proc/self/limits | awk '$1$2$3=="Maxopenfiles"{print $5}'
4096
因此第一个 %u将需要 5 个字符和第二个四个字符。

或者,您可以只为每个分配 20 个字符,以防在不久的将来任何时候都看不到 66 位 PID 或 FD :-) 您仍然可以检查 procfs文件,如果只是为了在它们太大时正常退出。

但是,老实说,这两个都有些矫枉过正,因为您可能已经有了一个旨在提供文件路径限制的东西, PATH_MAX (请参阅 limits.h ),适用于 Linux。使用它并减少浪费可能是可以的。而且,如果你没有那个,你可以通过调用 pathconf() 从最大长度中获取值。 .或者选择一个合理的默认值(比如 60 个字符),然后使用 snprintf检测实际路径是否比您的缓冲区长,然后优雅地退出。
如果您真的想使用最小存储的最佳方法(即,您认为 4K 的 PATH_MAX 浪费太多),那么请务必使用 strace方法,但根据我之前的评论(a)减去了两个。

(a) 如果您要到处为 4K 担心,您也可以完全做到 :-)

关于c -/proc/%u/fd/%u 的大小是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63464497/

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