Python Fuse 连续 6 次调用 'readlink'。

3
我正在使用Python Fuse实现一个文件系统。一个目录只包含符号链接,因此在getattr方法中返回S_IFLNK | 0777
现在,当我在该目录上执行ls时,我注意到Linux对目录中的每个条目连续调用readlink方法6次。
这是我的问题还是正常行为?

那看起来有 bug,但这是我第一次遇到 Fuse 或 readlink,所以我可能错了! - Wayne Werner
你找到多次调用的原因了吗? - Ethan Furman
@EthanFurman 很遗憾我没有记录这个。通常情况下,我会更新这个问题,但似乎我没有找到答案,很可能采用了不同的策略。 - jldupont
2个回答

2

好的,这肯定不是ls调用readlink超过一次。除非你使用了不寻常的标志?

$ls
entropy  share
$ls -l
total 0
lrwxrwxrwx 1 entropy users 14 Aug  8 14:26 entropy -> /home/entropy/
lrwxrwxrwx 1 entropy users 11 Aug  8 14:18 share -> /usr/share/
$ltrace ls 2>&1 | grep readlink
$ltrace ls -l 2>&1 | grep readlink
readlink(0xbfdbb6c0, 0x9549b90, 15, 0, 0xb75ceec8) = 14
readlink(0xbfdbb6c0, 0x954a148, 12, 0xbfdbb992, 0) = 11
$

从这里看来,不带标志的ls从未调用readlink函数,只有在给定长标志时才会调用一次。我对fuse不是很了解,更不用说python fuse了。所以很遗憾,我无法回答你的原始问题,但我认为这看起来非常像你方面的错误行为,但我可能错了。


啊,没错,ltrace、strace 和一点 grep 的结合非常有用于调试 :) - entropy

1
你在getattr中正确设置了st_size吗?ls命令将首先尝试使用返回的st_size缓冲区大小,并将其加倍,直到readlink缓冲区适合为止。

谢谢您的建议:我会在回到这个项目时尝试并报告结果。 - jldupont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接