/dev/fd/3には何か特別なものがあります

/dev/fd/3には何か特別なものがあります

私はファイル記述子を理解しようとしてきました。 「ls -l /dev/fd/」と入力すると、次のメッセージが表示されます。

lrwx------ 1 me users 64 May  2 16:02 0 -> /dev/pts/5
l-wx------ 1 me users 64 May  2 16:02 1 -> /home/me/file
lrwx------ 1 me users 64 May  2 16:02 2 -> /dev/pts/5
lr-x------ 1 me users 64 May  2 16:02 3 -> /proc/31518/fd

/dev/fd/3 は現在のプロセスを指しているようです。しかし、私は次のようなファイル記述子の解釈を見ました。 http://www.tldp.org/LDP/abs/html/io-redirection.html、/dev/fd/3が特別なものであるとは言わないでください(そしてN> 3の/dev/fd/Nと同じであることを示唆してください)。ここで何が起こっているのでしょうか?

私はアーチLinuxとUbuntuでこれを観察しましたが、SSHアカウントを持つSolarisサーバーでは観察しませんでした。

ベストアンサー1

/dev/fd/3 は現在のプロセスを指しているようです。

つまり、lsそれ自体です(PIDは後で存在しません)。ファイル記述子はグローバルではないため、これらのすべては実際には現在のプロセスに属します。システム全体に対して 0、1、2 が 1 つだけではなく、各プロセスに別個の 0、1、2 があるためです。

Frederik Dweerdtが指摘したように、/dev/fdシンボリックリンクです。ls他の端末で操作を繰り返すと、他のptyへのリンクが表示されます。これはコマンドの出力と一致しますtty

このls例では、記述子 3 がファイルシステムを読み取るために使用されると仮定します。一部のCコマンド(例open():)は、戻りが保証されるファイル記述子の生成をサポートしています。「最も低い番号の未使用のファイル記述子」POSIX- 低レベルopen()は実際には標準Cの一部ではありません。したがって、閉じた後はリサイクルされます(他のファイルを繰り返し開いて閉じると、fdで3が表示され続けます)。

これがどのように存在するかを理解するには、opendir()lsのソースコードにあるCコードの断片を参照してください。

// open directory for reading
DIR *dh = opendir(".");
// print the fd of the directory handle to standard out:
printf("fd: %d\n", dirfd(dh));
closedir(dh);  

現状のまま実行すると、fdは未使用の最低記述子(0、1、2がすでに存在する)なので、3になります。

おすすめ記事