/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になります。

答え2

/dev/fd/3標準記述子ではありません(編集:割り当て)。あなたのケース()による(編集:0、1、2以上)ls。 straceを介してlsを実行すると、何が起こっているのかを確認できます。

strace -e trace=openat,readlink ls -l /dev/fd/
openat(AT_FDCWD, "/dev/fd/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
readlink("/dev/fd/0", "/dev/pts/0", 65) = 10
readlink("/dev/fd/1", "/dev/pts/0", 65) = 10
readlink("/dev/fd/2", "/dev/pts/0", 65) = 10
readlink("/dev/fd/3", "/proc/28401/fd", 65) = 14

ls/dev/fdと同じ内容を表示するだけです/proc/self/fdlsその項目を読むには、ディレクトリを開く必要があります。/dev/fd/3そのディレクトリのファイル記述子です。

他のプログラムには以下がありません/dev/fd/3

start cmd:> sleep 100 &
[1] 28414

ec:0   17:28:10  hl@inno:~/.wine/drive_c
start cmd:> ls -l /proc/28414/fd
insgesamt 0
crw------- 1 hl tty 136, 0 18. Apr 01:18 0
crw------- 1 hl tty 136, 0 18. Apr 01:18 1
crw------- 1 hl tty 136, 0 18. Apr 01:18 2

答え3

Archlinux/dev/fdでは、/proc/self/fd.fdこのlsコマンドはディレクトリをファイル記述子3として開きます。

編集:ところで、何が起こっているのかを理解するための良い方法は、straceファイル記述子を開くプロセスを見ることです。

関連情報