3

我正在使用 Python Fuse 实现一个文件系统。目录仅包含symlinks,因此我返回S_IFLNK | 0777getattr方法。

现在,当我ls对目录执行操作时,我注意到 Linux为目录中的每个条目readlink连续调用了 6 次方法。

这是我这边的错误还是正常行为?

4

2 回答 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,如果给出了 long 标志,每个链接只会调用一次。我对保险丝了解不多,更不用说python保险丝了。所以不幸的是,我不能回答你原来的问题,只是说这看起来很像你这边的错误行为,但我可能是错的。

于 2010-08-08T11:38:00.343 回答
1

您是否在 getattr 中正确设置了 st_size?ls 将首先尝试使用返回的 st_size 的缓冲区大小并将其加倍,直到 readlink 缓冲区适合。

于 2011-10-26T00:09:53.260 回答