回答:
すべての4 /dev/fd/0
、/dev/stdin
、/proc/self/fd/0
および/dev/pts/2
ファイル名ですが、のようにされている/////dev/../dev/fd//0
、/bin/sh
、/etc/fstab
、/fioejfoeijf
、などのすべてが、その最後の例は、おそらくあなたのマシン上の既存のファイルの名前べきです。ファイル名は、ファイルシステム上のファイルを指定できる文字列です。Linuxでは、ヌルバイトを含まず、長さが最大4096バイトの文字列が有効なファイル名です。これらの名前の多くは同等です。たとえば、/bin/sh
と同等///bin/sh
です/bin/../bin/sh
(/bin
既存のディレクトリを想定しています)など。これまでに説明した例はすべて絶対ファイル名です。また、a /
で始まらない相対ファイル名もあり、その意味は現在のディレクトリによって異なります。
ファイル名を取り巻く用語は一般的ではありません。「ファイル名」はファイルへのフルパスを意味することもあれば、ディレクトリエントリの名前を意味することもあります。POSIXの用語は、ディレクトリエントリの名前の場合は「filename」または「pathname component」、フルパスの場合は「pathname」です。
ファイル記述子は、特定のプロセスで開いているファイルを指定します。カーネルは、各プロセスのファイル記述子のテーブルを維持します。ファイル記述子テーブルの各エントリは、プロセスがファイル記述子に対する読み取り、書き込み、およびその他の操作を要求した場合の対処法を示しています。
ファイル記述子はファイルに対応し、名前が関連付けられている場合がありますが、すべてがそうであるとは限りません。その場合、ファイルは通常のファイル、ディレクトリ、デバイスファイル、または名前付きパイプ(FIFOとも呼ばれます)(によって作成された種類mkfifo
)です。UNIXソケットやドアなど、一部のシステムにはさらに可能性があります。名前付きファイルが関連付けられていないファイル記述子の例には、パイプ(によって作成された種類pipe
)およびネットワークソケットが含まれます。
/dev/fd/0
、/dev/stdin
および/proc/self/fd/0
特殊な意味を持つファイル名(すべて同等)です。これらはすべて、ファイル記述子0を介して現在アクセスされているファイルを指定します。プロセスがこれらを開くと、カーネルはファイル記述子記述子テーブルのインデックス0のエントリを新しいディスクリプタ。これらのファイルを開くことは、を呼び出すことと同じdup(0)
です。名前付きファイルは、新しいファイルを開くのではなく、すでに開いているファイルの1つを使用するように間接的にプロセスを取得する方法です。それらは、プログラムがファイルの名前を開くことを期待するプログラムのコマンドラインを渡すのに最も役立ちます。
ファイル名はファイルシステム上のファイルの名前であり、それ以上のものではありません-それは単なる文字列です。
ファイル記述子は、オブジェクトの一種であり、そこから読み取りや書き込みを行うことができます。それが開かれ、準備ができたファイルです。ファイル記述子だけでなく、stdin、stdout、stderrも記述子であり、ファイルとまったく同じ関数を使用して、ファイルからの書き込みと読み取りを行うことができます(たとえば、シークできない)。ファイルではない記述子の他の例は、名前付きパイプとネットワークソケットです。
コードでは、ファイル記述子は変数であり、ファイルオブジェクトを表すカーネル内の何かへのポインタです。
たとえば、/ dev / fd / 0、/ dev / stdin、/ proc / self / fd / 0はすべて/ dev / pts / 2へのリンクです。これらの4つのファイル記述子、またはファイル名ですか?
これらはすべて疑似ファイルであり、一部のスクリプトまたはプログラムで役立ちます。それらを開くことができ、open()はファイル記述子を返します。