Linuxでゼロバイトファイルを生成するという概念は何ですか?

Linuxでゼロバイトファイルを生成するという概念は何ですか?

次のようにすると:

touch /tmp/test

その後実行

ls -la /tmp/

testファイルを見ることができます。0バイトディレクトリに。

しかし、オペレーティングシステムはこの概念をどのように扱いますか?0バイト。平信度の用語で表現すると、次のようになります。

0バイトはメモリがまったくないことを意味するので、何も生成されません。

ファイルを作成し、〜しなければならないまたはしなければならない少なくとも一定量のメモリが必要です。そうですか?

答え1

ファイルは(およそ)3つに分けられます。

  • 「inode」は、ファイルの所有者、権限、実際にデータを含むディスクのブロックのリストを追跡するために使用されるメタデータ構造です。
  • このinodeを指す1つ以上のディレクトリエントリ(ファイル名)
  • 実際のデータブロック自体

空のファイルが作成されると、inodeとそのinodeを指すディレクトリエントリのみが生成されます。希少ファイル()の場合も同様ですdd if=/dev/null of=sparse_file bs=10M seek=1

既存のファイルへのハードリンクを作成するときは、同じinodeを指す追加のディレクトリエントリを作成するだけです。

私はここで仕事を簡素化していますが、あなたはアイデアを得ます。

答え2

touch作成しますインデックスノードls -iまたはstatinodeに関する情報を表示します。

$ touch test
$ ls -i test
28971114 test
$ stat test
  File: ‘test’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 28971114    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/1000)   Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
 Birth: -

test0ブロックが使用されることに注意してください。表示されたデータを格納するために、inodeはいくつかのバイトを使用します。このバイトは inode テーブルに格納されます。 ext2ページを確認してください。inode構造例

答え3

ls(またはstat(2)システムコール)は、次のサイズを示します。コンテンツファイル。会計のためにファイルシステムに必要なスペースの量はその一部ではなく、実装の詳細として一般的なプログラミングの一部ではありません。しなければならない心配しても知っています。実装の詳細を表示すると、ファイルシステムの抽象化の有用性が低下します。

答え4

簡単な答え:そう定義されているからです。

より長い回答:一部の作業は概念的に簡単なため、このように定義されています。

  • ファイルに「A」20文字が含まれていて「A」をすべて削除すると、ファイルは20バイト短くなります。 「AAAAAAAAAAAAAAAAAAAAA」のみを含むファイルに対して同じ操作を実行するには、ファイルが消える特別なケースを処理する必要があります。
  • より実質的にテキストファイルの最後の行を削除するには、特別な処理が必要です。
  • 定期的にバックアップするテキストエディタには、ユーザーが最後の行を削除してランチをしてから戻って別の行を追加できる状況を処理するための特別なケースコードが必要です。他のユーザーが同時にその名前でファイルを生成すると、より複雑になります。

より多くのことができます。 * エラーログファイルは、しばしば空の状態で生成され、エラーが発生した場合にのみ入力されます。 *エラーが発生した回数を確認するには、ログファイルの行数を数えてください。ログファイルが空の場合、エラー数はゼロであるため、これは非常に合理的です。 *時には、ファイル名に関連テキストがすべて含まれているファイルを表示することがあります。たとえば、this-is-the-logging-directoryインストール後に熱心な管理者が空のディレクトリを削除するのを防ぎ、プログラムまたはユーザーが誤ってプログラムが後で表示したいディレクトリを作成するのを防ぎます。ファイルエラー。プログラムgit(および他のプログラム)は空のディレクトリを無視する傾向がありemptyますempty.directory

どんな作業もより複雑になりません。

  • ファイルの関連付け:これは空のファイルに対する操作ではありません。
  • ファイル内の文字列の検索:「ファイルが検索語より短い場合は検索語を含めることはできません」という標準的なケースがこれに相当します。
  • ファイルから読み取る:プログラムは予想される内容を取得する前にファイルの終わりに到達することを処理する必要があるため、長さゼロのファイルの場合はプログラマー側でさらに考える必要はありません。ファイル - 最初からファイルを起動します。

ファイルに関する限り、「どこかに記録されたファイルがあります」という側面(inodeおよび/またはファイル名)は上記の考慮事項よりも重要ですが、ファイルシステムは空のファイルが役に立たない場合はこれを行いません。

通常、上記のすべての理由は、ファイル名に関連する理由を除くシーケンスに適用されます。最も注目すべきは、文字列である文字列です。長さ0の文字列はプログラムで一般的です。文字列が意味をなさない場合、通常はユーザーレベルでは許可されません。ファイル名は文字列であり、ほとんどのファイルシステムは内部的に空の文字列をファイル名として受け入れません。フラグメントからファイル名を作成すると、プログラムは空の文字列をファイル名として扱います。文字列をフラグメントの1つとして扱います。

関連情報