我正在python上开发fuse fs(使用fuse-python绑定)。我需要用什么方法来实现触摸正确工作?目前我有下一个输出:
$ touch m/My\ files/d3elete1.me
touch: setting times of `m/My files/d3elete1.me': Invalid argument
文件存在“d3elete1.me”:
$ ls -l m/My\ files/d3elete1.me
-rw-rw-rw- 1 root root 0 Jul 28 15:28 m/My files/d3elete1.me
此外,我还试图跟踪系统调用:
$ strace touch m/My\ files/d3elete1.me
...
open("m/My files/d3elete1.me", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) = 3
dup2(3, 0) = 0
close(3) = 0
utimensat(0, NULL, NULL, 0) = -1 EINVAL (Invalid argument)
close(0) = 0
...
如您所见 utimensat 失败。我试图实现空 utimens 和 utime ,但它甚至都没有被调用。
答案 0 :(得分:2)
尝试使用-f选项启动fuse。保险丝将保持在前台,您可以在控制台中看到错误。
答案 1 :(得分:1)
您必须实施utimens
和getattr
。并非所有系统调用都必须直接映射到您可能期望的C调用。其中许多内容由FUSE内部用于检查和导航文件系统,具体取决于设置的FUSE选项。
我相信你的情况FUSE在utimesat
到utimens
的解释之前,用getattr
检查以验证所请求的文件是否存在,并且具有预期的属性。< / p>
这是一个很大的巧合。以下评论建议该问题与FUSE不支持utimensat
的事实相符。这不是的情况。我在Ubuntu 10.04上使用fuse-python时提供了完全相同的回溯。我捅了一下,看起来fuse-python 0.2绑定是针对FUSE 2.6的,可能是稍微改变引入了这个错误(FUSE现在是2.8版本)。我的解决方案是停止使用fuse-python(代码是一个丑陋的混乱),我找到了一个替代绑定fusepy。我没有回头,从此没有遇到任何麻烦。
我强烈建议您看一下,您的初始化代码将更清晰,并且需要进行最小的更改以适应新的绑定。最重要的是,它只有一个模块,并且易于阅读。