1

stattest.c:

// compile: gcc -o stattest stattest.c
#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char *argv[]) {
    struct stat stats;
    stat(argv[1], &stats);
    printf("%lli\n", (long long)stats.st_dev);
    return 0;
}

使用法:

stat -f "%r" /dev/disk0
=> 234881024 (探している値)

./teststat /dev/disk0
=> 44921876

python -c 'import os,sys; print os.stat(sys.argv[1]).st_dev' /dev/disk0
=> 44921876

statコマンドが提供する値をコードが提供しないのはなぜですか?

更新 1

44921876 のメジャー番号を抽出すると、2 が得られます/dev/tty

更新 2

ファイルシステム上のファイルを指定すると機能します。(ここではPythonの方が速いので、Pythonのみを使用しています。)

python -c "import sys,os; print os.stat(sys.argv[1]).st_dev" /path/to/file
=> 234881024
4

1 に答える 1

4

st_rdevメンバーを印刷してみてください。マニュアルページには次のように書かれています:

struct stat {
   dev_t    st_dev;    /* device inode resides on */
   [ ... snip ... ]
   dev_t    st_rdev;   /* device type, for special file inode */
};

%r フォーマッタがアクセスするのと同じフィールドを出力していないと思います。あなたが関心があるのは、デバイス ファイルが存在するデバイスではなく、ファイルが記述しているデバイスです。

数値は少なくともls出力と一致しています。メジャー = 14 およびマイナー = 0 で、234881024 を出力します。これは 16 進数で 0xE000000 です。もちろん、0xE は 14 進数です。これは、Mac OS X が上位 8 ビットにメジャー番号を格納し、下位 24 ビットにマイナー番号を格納することを示しています。これは、dev_tタイプが 32 ビットであることを意味するため、印刷long longが少し疑わしいものになります。

于 2009-10-29T10:47:20.007 に答える