2011-12-14 9 views
2

質問解決済み! @ basile-starynkevitchのおかげで、struct statが異なるファイルで同じサイズでないことがわかりました!ヒューズファイルシステムはgetattr関数のstruct stat * stbufの値を変更できません。

<sys/stat.h>では、sizeof(struct stat)は88バイトですが、ヒューズのlib(-D_FILE_OFFSET_BITS=64フラグのためだと思います)の場合、これは96バイトです。

私のリモートサーバにfuse libを追加すると(gccに-D_FILE_OFFSET_BITS=64 /usr/local/lib/libfuse.so /usr/local/lib/libulockmgr.soフラグが追加されます)、プログラムが正しく動作します!

ありがとうございました!


私はヒューズでいくつかのプロジェクトをやっていて、私は狂っています。

struct stat * stbufのデータをリモートサーバーから送信し、サーバーとクライアントの両方でデータが正しいですが、memcpyを使用してstbufにデータを複製すると、何もコピーされていないようです。私はまた、read(socked、stbuf、sizeof(struct stat))を使用しようとします。直接、しかしそれはあまりにも機能しません。

39  res=read(sockfd, &buf, sizeof(struct stat)); 
3: (struct stat)stbuf = {st_dev = 694294557525955008, __pad1 = 0, __st_ino = 0, 
    st_mode = 0, st_nlink = 0, st_uid = 0, st_gid = 0, st_rdev = 0, __pad2 = 0, 
    st_size = 0, st_blksize = 0, st_blocks = 0, st_atim = {tv_sec = 0, tv_nsec = 0}, 
    st_mtim = {tv_sec = 0, tv_nsec = 0}, st_ctim = {tv_sec = 0, tv_nsec = 0}, 
    st_ino = 0} 
1: buf = {st_dev = 0, __pad1 = 0, __st_ino = 0, st_mode = 0, st_nlink = 0, 
    st_uid = 0, st_gid = 0, st_rdev = 0, __pad2 = 0, st_size = 0, st_blksize = 0, 
    st_blocks = 0, st_atim = {tv_sec = 0, tv_nsec = 0}, st_mtim = {tv_sec = 0, 
    tv_nsec = 0}, st_ctim = {tv_sec = 0, tv_nsec = 0}, st_ino = 0} 

後:ここ

は、コード...(st_inoの中にはそのようなファイル、-ENOENT保存リモートサーバーが存在しない場合)

static int rof_getattr(const char *path, struct stat *stbuf) 

     { 

    int res = 0; 
    struct cmd sndcmd; 
    struct stat buf; 

    memset(&sndcmd, 0, sizeof(struct cmd)); 

    strcpy(sndcmd.cmd, "GETATTR"); 
    strcpy(sndcmd.str, path); 
    memset(stbuf, 0, sizeof(struct stat)); 
GTTR_AGN: 
    memset(&buf, 0,sizeof(struct stat)); 
    write(sockfd, &sndcmd, sizeof(struct cmd)); 
    res=read(sockfd, &buf, sizeof(struct stat)); 

    if(res!=sizeof(struct stat)) 
     goto GTTR_AGN; 

    memcpy(stbuf,&buf,sizeof(buf)); 
    if (buf.st_ino==-ENOENT) 
     return -ENOENT; 
return 0; 
     } 

私はGDBから取得したデータでありますread()は、

をstbufする
(gdb) s 
40  memcpy(stbuf,&buf,sizeof(buf)); 
3: (struct stat)stbuf = {st_dev = 694294557525955008, __pad1 = 2049, __st_ino = 0, 
    st_mode = 0, st_nlink = 943887, st_uid = 16877, st_gid = 2, 
    st_rdev = 4294967297000, __pad2 = 0, st_size = 0, st_blksize = 4096, 
    st_blocks = 34359742464, st_atim = {tv_sec = 1323833759, tv_nsec = 75415995}, 
    st_mtim = {tv_sec = 1323729515, tv_nsec = 6514929}, st_ctim = { 
    tv_sec = 1323729515, tv_nsec = 6514929}, st_ino = 0} 
1: buf = {st_dev = 2049, __pad1 = 0, __st_ino = 943887, st_mode = 16877, 
    st_nlink = 2, st_uid = 1000, st_gid = 1000, st_rdev = 0, __pad2 = 0, 
    st_size = 17592186048512, st_blksize = 8, st_blocks = 323909233444133279, 
    st_atim = {tv_sec = 1323729515, tv_nsec = 6514929}, st_mtim = { 
    tv_sec = 1323729515, tv_nsec = 6514929}, st_ctim = {tv_sec = 0, tv_nsec = 0}, 
    st_ino = 0} 
(gdb) s 

bufのコピーデータにデータを得ました
41  if (stbuf->st_ino==-ENOENT) 
3: (struct stat)stbuf = {st_dev = 694294557525955008, __pad1 = 2049, __st_ino = 0, 
    st_mode = 0, st_nlink = 943887, st_uid = 16877, st_gid = 2, 
    st_rdev = 4294967297000, __pad2 = 0, st_size = 0, st_blksize = 4096, 
    st_blocks = 34359742464, st_atim = {tv_sec = 1323833759, tv_nsec = 75415995}, 
    st_mtim = {tv_sec = 1323729515, tv_nsec = 6514929}, st_ctim = { 
    tv_sec = 1323729515, tv_nsec = 6514929}, st_ino = 0} 
1: buf = {st_dev = 2049, __pad1 = 0, __st_ino = 943887, st_mode = 16877, 
    st_nlink = 2, st_uid = 1000, st_gid = 1000, st_rdev = 0, __pad2 = 0, 
    st_size = 17592186048512, st_blksize = 8, st_blocks = 323909233444133279, 
    st_atim = {tv_sec = 1323729515, tv_nsec = 6514929}, st_mtim = { 
    tv_sec = 1323729515, tv_nsec = 6514929}, st_ctim = {tv_sec = 0, tv_nsec = 0}, 
    st_ino = 0} 

stbufはまったく変更されません。

誰も私にそのような現象についての示唆を与えることができますか?私はいくつかの仕事をしましたが、まだ解決策を見つけることはありません。

+0

Basile Starynkevitchのおかげで、resのチェックを追加しました。 – bxshi

+0

チェックが間違っています。私が説明したように、4つのケースがあります。 –

+0

16進数でダンプし、 'buf'をasciiしてみてください。あなたは予期せぬことを読んでいるかもしれません... –

答えて

1

あなたのコードでは、読み取りバイト数resを確認してください。

それはファイルの末尾に0にすることができ、それはエラー時に-1することができ、それは...、すべてのバイトが受信されていない場合はsizeof(struct stat)になる可能性もあり

読む(あなたの目と脳と)システムのman page of read(2)を非常に慎重に(そして再度2度読んでください)。

+0

私はそれをチェックしません、私はちょうど私が正しくデータを取得するかどうかを知りたい、私のコードの右側にチェックステートメントはありません?これを追加するのは、デバッグ中に表示したいからです。その影響は結果ですか?私はちょうどここに値を追加します... – bxshi

+0

'res'の値をチェックする必要があります....'res <0'(エラー)、' res == 0'(ファイルの終わりに達する)、 'res

+0

ありがとう、ありがとう。もう1つの質問は、gdbの出力を参照してください、なぜ私はbufでデータを正しく取得することができますが、ポインタstbufにコピーすることはできません? – bxshi

関連する問題