$ 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。它们分别被分配为0、1和2。
您所看到的是ls(1)
工作方式的一个工件:为了读取/proc/self/fd
目录的内容并显示它,需要打开该目录。
这意味着它获得一个文件句柄,通常是第一个可用的文件句柄......因此,3。
cat
如果您要在单独的控制台上运行并检查/proc/${pid}/fd
它,您会发现只分配了前三个。
答案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);
}
您可以创建两个不同的文件(a.txt 和 b.txt),当您使用 open() 时,它将获得不同的文件描述符,对我来说,我有 3,4
3
4
因为0,1,2有默认值和含义
- 0:STDIN(标准输入)
- 1:STDOUT(标准输出)
- 2:STDERR(标准错误)