默认分配的文件描述符3是什么?

默认分配的文件描述符3是什么?
$ 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(标准错误)

相关内容