私はファイル記述子を理解しようとしてきました。 「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/fd
。ls
その項目を読むには、ディレクトリを開く必要があります。/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
ファイル記述子を開くプロセスを見ることです。