2017-01-30 6 views
1

を立ち往生。loggedfsは私が指定したディレクトリのすべてのシステムコールをログに記録したいと私は私がしたいだけのように、このリポジトリ</p> <p>それはヒューズと仮想ファイルシステムを作成し、その中にすべてのログを記録<a href="https://github.com/rflament/loggedfs" rel="nofollow noreferrer">https://github.com/rflament/loggedfs</a>を見つけた

私はそれをMacで移植しようとしましたが、それはosxで動作しない "トリック"を使用します。 lstatが10秒間スタックしてクラッシュしました。

私はなぜそれを理解したいですか?

これは私のコードの主要な部分である:

// g++ -Wall main.cpp `pkg-config fuse --cflags --libs` -o hello 

#define FUSE_USE_VERSION 26 

#include <fuse.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 

static char *path; 
static int savefd; 

static int getattr(const char *path, struct stat *stbuf) 
{ 
    int res; 
    char rPath[1024]; 

    strcpy(rPath, "."); strcat(rPath, path); 

    res = lstat(rPath, stbuf); // Mac stuck here 
    return (res == -1 ? -errno : 0); 
} 

static void* loggedFS_init(struct fuse_conn_info* info) 
{ 
    fchdir(savefd); close(savefd); return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    struct fuse_operations oper; 

    bzero(&oper, sizeof(fuse_operations)); 
    oper.init  = loggedFS_init; 
    oper.getattr = getattr; 

    path = strdup(argv[argc - 1]); 
    printf("chdir to %s\n", path); 
    chdir(path); 
    savefd = open(".", 0); 

    return fuse_main(argc, argv, &oper, NULL); 
} 
+0

はrPathにマウントされたドライブへのパスが含まれていますか? 問題を理解しているかどうか確信はありませんが、ヒューズのコールバックからドライブ内のファイル操作を行うべきではありません。デッドロックにつながります – DoN1cK

答えて

0

私はLoggedFSで非常によく見ていたとpjdfstestを使用してPOSIX準拠のためにそれをテストし、3 issues (or groups of issues)になります。私はre-implementing it in Pythonを完全にPOSIXに準拠させました。私はOS Xでまだテストしていないので、いくつかのフィードバックをお寄せください)

あなたが言及している "トリック"は、私が完全にはわかっていませんが、問題の根本原因になる可能性があります。これは、パスに別の文字を追加することによって基本的な問題を引き起こし、長さがpathがPATH_MAXに近づくと問題につながります。 libfuseは、先頭に/のパスをFUSE操作に渡しています。追加の.と "誤解を招く" /( "グローバル"ルートフォルダではなく、マウントされたファイルシステムのルート)は2文字が "too many"で、PATH_MAXから2を引いた最大許容パス長を効果的に減らします。PATH_MAXユーザの土地ソフトウェアにPATH_MAXがより小さいことを知らせる。turned out to be impossible

しかし、方法があります。 initルーチン内のファイル記述子savefdを閉じないでください。それを開いたままにして、ファイルシステムがマウント解除されたときにFUSEによって呼び出されるdestroy routineに閉じます。実際には、相対パスを指定するのにsavefdを使用できます。 lstatの代わりにfstatatLinuxOS X/BSD)を使用できます。あなたはdirfdsavefdを渡し、pathnameにそれを渡す前にpathの内容から先頭/を削除する必要が

int fstatat(int dirfd, const char *pathname, struct stat *buf, 
     int flags); 

:そのプロトタイプは次のようになります。

関連する問題

 関連する問題