デバイスファイルを印刷しようとすると、出力にバイナリデータが16進形式で表示されます。しかし、ls -l /dev/sda
を実行すると、次のようになります。
brw-rw---- 1 root disk 8, 0 Jan 29 12:29 /dev/sda
ファイルの実際のサイズがわかりませんか?これらの数字はどういう意味ですか?
ls
やdu
のような単純な0
の代わりにstat
が表示される理由についてのドキュメントは見つかりませんが、Byte Commanderが言うように メジャーおよびマイナーデバイス番号 その特殊ファイルの。 ソースから :
if (f->stat_ok
&& (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode)))
{
char majorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
char minorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
int blanks_width = (file_size_width
- (major_device_number_width + 2
+ minor_device_number_width));
sprintf (p, "%*s, %*s ",
major_device_number_width + MAX (0, blanks_width),
umaxtostr (major (f->stat.st_rdev), majorbuf),
minor_device_number_width,
umaxtostr (minor (f->stat.st_rdev), minorbuf));
p += file_size_width + 1;
}
print_long_format()
関数 の一部であるこのコードは、出力形式が長い場合(-l
の場合)、文字のサイズの代わりにデバイス番号を使用し、ブロックデバイス。
デバイスの実際のサイズを取得するために、いくつかの方法が このUnixおよびLinuxの投稿 にリストされています。
「すべてがファイル」の概念を見逃したようです。
UNIXの世界では、すべて(データ、デバイス、ソケットなど)がファイルにマッピングされます。これらのファイルにはタイプがあります-ホームディレクトリの場合、(ほとんど)いわゆる通常のファイル(テキスト、プログラム、...)が見つかります。
これらの通常のファイルとは対照的に、/ dev-ディレクトリには、デバイスファイルが名前で示されているように保持されます。したがって、タイプcharacter、blockおよびpipeはデバイスを表します。/dev/memはシステムメモリを表すファイルで、/ dev/ttyACM0はシリアルモデムです。これらの(デバイス)ファイルと責任のあるドライバーとの間のリンクは、lsで示された(および上で説明された)メジャー番号とマイナー番号を使用して作成されます。
デバイスのサイズはデバイス固有の属性であり、デバイス固有のツールを使用してクエリを実行する必要があります(上記の投稿に示すように)データの無限ストリームを配信できるため、固定サイズはありません。/dev/nullには無限のストレージがあります:))。
ここで読むことができます: https://en.wikipedia.org/wiki/Everything_is_a_file