web-dev-qa-db-ja.com

デバイスファイルのサイズ(ls -l出力にありません)

デバイスファイルを印刷しようとすると、出力にバイナリデータが16進形式で表示されます。しかし、ls -l /dev/sdaを実行すると、次のようになります。

brw-rw----  1 root disk      8,   0 Jan 29 12:29 /dev/sda

ファイルの実際のサイズがわかりませんか?これらの数字はどういう意味ですか?

4
Abhishek Bhatia

lsduのような単純な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の投稿 にリストされています。

4
muru

「すべてがファイル」の概念を見逃したようです。

UNIXの世界では、すべて(データ、デバイス、ソケットなど)がファイルにマッピングされます。これらのファイルにはタイプがあります-ホームディレクトリの場合、(ほとんど)いわゆる通常のファイル(テキスト、プログラム、...)が見つかります。

これらの通常のファイルとは対照的に、/ dev-ディレクトリには、デバイスファイルが名前で示されているように保持されます。したがって、タイプcharacter、blockおよびpipeはデバイスを表します。/dev/memはシステムメモリを表すファイルで、/ dev/ttyACM0はシリアルモデムです。これらの(デバイス)ファイルと責任のあるドライバーとの間のリンクは、lsで示された(および上で説明された)メジャー番号とマイナー番号を使用して作成されます。

デバイスのサイズはデバイス固有の属性であり、デバイス固有のツールを使用してクエリを実行する必要があります(上記の投稿に示すように)データの無限ストリームを配信できるため、固定サイズはありません。/dev/nullには無限のストレージがあります:))。

ここで読むことができます: https://en.wikipedia.org/wiki/Everything_is_a_file

3
hecke