Python Fuse 连续调用 'readlink' 六次

3 投票
2 回答
565 浏览
提问于 2025-04-16 02:14

我正在用Python的Fuse来实现一个文件系统。一个目录里只包含symlinks(符号链接),所以在getattr这个方法里,我返回了S_IFLNK | 0777

现在,当我在这个目录里执行ls命令时,我发现Linux会对目录里的每一个条目连续调用readlink方法6次。

这是我这边的bug,还是正常现象呢?

2 个回答

1

你在getattr里有没有正确设置st_size?ls命令会先用你返回的st_size大小来尝试读取,如果不够,它会把这个大小翻倍,直到能装下readlink的内容为止。

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了。所以很遗憾,我无法回答你最初的问题,只能说这看起来很像是你那边出现了bug,但我也可能是错的。

撰写回答