$ ls -og /proc/self /proc/self/fd
lrwxrwxrwx 1 64 Jun 18 11:12 /proc/self -> 32157
/proc/self/fd:
total 0
lrwx------ 1 64 Jun 22 2012 0 -> /dev/tty1
lrwx------ 1 64 Jun 22 2012 1 -> /dev/tty1
lrwx------ 1 64 Jun 22 2012 2 -> /dev/tty1
lr-x------ 1 64 Jun 22 2012 3 -> /proc/32157/fd
デフォルトの割り当てファイル記述子3とは何ですか?
答え1
なし:STDIN、STDOUT、およびSTDERRの3つの標準ファイル記述があります。それぞれ0、1、2が割り当てられます。
あなたが見ているのは、ls(1)
これがどのように機能するかについての人工物です。ディレクトリの内容を読んで表示するには、/proc/self/fd
ディレクトリが開いている必要があります。
つまり、通常使用可能な最初のハンドルであるファイルハンドルを取得します。したがって、3.
cat
別のコンソールで実行してスキャンすると、/proc/${pid}/fd
最初の3つだけが割り当てられていることがわかります。
答え2
これは、実行中のプロセスのパイプを読み取るためにも使用できます。
$ head /proc/21028/fd/3
declare -ax a_name='([0]="
8006333 (10.161.154.1)" [1]="
6006583 (10.179.231.1)" [2]="
9001437 (10.125.167.1)" [3]="
2003192 (10.138.247.1)" [4]="
4005015 (10.120.139.1)" [5]="
$ grep -n printf pol-grab.sh | grep ^54
54: export add_the_name="$(printf "%s\n" "$(declare -p a_name)")"
答え3
#include <fcntl.h>
#include <stdio.h>
int main(void)
{
int fd1;
int fd2;
char buffer1[] = "a.txt";
char buffer2[] = "b.txt";
fd1 = open(buffer1, O_WRONLY);
fd2 = open(buffer2, O_WRONLY);
printf("%d\n", fd1);
printf("%d\n", fd2);
}
2つの異なるファイル(a.txtとb.txt)を作成でき、open()を使用すると異なるファイル記述子を取得できます。私の場合は3,4個でした。
3
4
0,1,2 にはデフォルト値と意味があるため
- 0:STDIN(標準入力)
- 1: STDOUT(標準出力)
- 2: STDERR(標準エラー)