ファイル記述子とファイル名


12

ファイル記述子とファイル名の間にはどのような違いと関係があるのだろうと思いました。それらはすべてファイルへのアクセスに使用されますか?はいの場合、同じように?

たとえば、/dev/fd/0/dev/stdin、および/proc/self/fd/0すべてへのリンクです/dev/pts/2。これらの4つのファイル記述子、またはファイル名ですか?


回答:


12

すべての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つを使用するように間接的にプロセスを取得する方法です。それらは、プログラムがファイルの名前を開くことを期待するプログラムのコマンドラインを渡すのに最も役立ちます。


@Gilesあなたが書いた「ファイル記述子テーブルの各エントリは、プロセスがファイル記述子に対する読み取り、書き込み、およびその他の操作を要求した場合に何をすべきかを示しています。」(強調鉱山)。私が理解している限り、これはstdin、stdout、stderrのそれぞれの標準0、1、2などの整数にすぎません。通常のファイルの場合は、より高い値になります。私があなたのコメントから得ていないことは、この数が「プロセスがファイル記述子に対する読み取り、書き込み、およびその他の操作を要求した場合に何をすべきか」を示す方法です。。これについて少し詳しく教えてください。
オタク2014

@Geekファイル記述子テーブルのエントリが数値ではありません。番号はそのテーブルへのインデックスです。
Gilles「SO-邪悪なことをやめ

@Giles私の誤解を明確にしてくれてありがとう。私は今それをよく理解しています。では、「何をすべきか」の例を回答に含めてください。ファイル記述子テーブルの各エントリには、ファイルオフセット、ファイルステータスなどの情報を含むファイルテーブルへのポインタが含まれていることを確認しました。
オタク2014

2

ファイル名はファイルシステム上のファイルの名前であり、それ以上のものではありません-それは単なる文字列です。

ファイル記述子は、オブジェクトの一種であり、そこから読み取りや書き込みを行うことができます。それが開かれ、準備ができたファイルです。ファイル記述子だけでなく、stdin、stdout、stderrも記述子であり、ファイルとまったく同じ関数を使用して、ファイルからの書き込みと読み取りを行うことができます(たとえば、シークできない)。ファイルではない記述子の他の例は、名前付きパイプとネットワークソケットです。

コードでは、ファイル記述子は変数であり、ファイルオブジェクトを表すカーネル内の何かへのポインタです。

たとえば、/ dev / fd / 0、/ dev / stdin、/ proc / self / fd / 0はすべて/ dev / pts / 2へのリンクです。これらの4つのファイル記述子、またはファイル名ですか?

これらはすべて疑似ファイルであり、一部のスクリプトまたはプログラムで役立ちます。それらを開くことができ、open()はファイル記述子を返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.