質問

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                  (Value that I'm looking for.)

./teststat /dev/disk0
=>  44921876

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

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

更新1

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

更新2

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

python -c "import sys,os; print os.stat(sys.argv[1]).st_dev" /path/to/file
=> 234881024
役に立ちましたか?

解決

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top