2

私は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は失敗しました。空のutimensutimeを実装しようとしましたが、呼び出されません。

4

2 に答える 2

2

-fオプションを指定してヒューズを起動してみてください。ヒューズはフォアグラウンドに留まり、コンソールにエラーが表示されます。

于 2010-07-28T13:24:22.980 に答える
1

とを実装する必要がutimensありgetattrます。すべてのシステムコールが、必ずしも期待しているCコールに直接マップされるわけではありません。それらの多くは、設定されているFUSEオプションに応じて、ファイルシステムをチェックおよびナビゲートするためにFUSEによって内部的に使用されます。

あなたの場合、FUSEはutimesattoの解釈の前にあり、要求されたファイルが存在し、期待される属性を持っていることを確認するためutimensのチェックが行われていると思います。getattr

Update0

これは大きな偶然です。FUSEがサポートしていないという事実に問題が気に入っているという提案の下にコメントがありますutimensat。これは当てはまりません。Ubuntu10.04でfuse-pythonを使用しているときに提供したものとまったく同じトレースバックがありました。少し調べてみると、fuse-python0.2バインディングはFUSE2.6用であるように見えますが、わずかな変更によってこのエラーが発生した可能性があります(FUSEは現在バージョン2.8です)。私の解決策はfuse-pythonの使用をやめることでした(コードは醜い混乱です)、そして私は別のバインディングfusepyを見つけました。振り返ることはなく、それ以来問題はありませんでした。

ご覧になることを強くお勧めします。初期化コードがよりクリーンになり、新しいバインディングに適応するために最小限の変更が必要になります。何よりも、それはたった1つのモジュールであり、簡単に読むことができます。

于 2010-07-28T13:20:56.847 に答える