`ll /proc/self/fd/` (来自 `ll /dev/fd`)的输出是什么意思?

`ll /proc/self/fd/` (来自 `ll /dev/fd`)的输出是什么意思?

相关,但是不是重复:

  1. /dev/fd 不一致
  2. /dev/fd 与 /proc/self/fd/ 有何关系?
  3. 为什么进程替换会产生一个名为 /dev/fd/63 的文件,该文件是一个管道?

在 Ubuntu 18.04 和 20.04(Ubuntualias ll='ls -alF'在 中定义)上~/.bashrc,我看到以下输出:“软盘驱动器”/dev/fd设备:

为了ls

$ ls /dev/fd
0  1  2  3

为了ll

$ ll /dev/fd
lrwxrwxrwx 1 root root 13 Nov  5 11:46 /dev/fd -> /proc/self/fd/

我可以看到/dev/fd是 的符号链接/proc/self/fd/,所以我ll看到:

$ ll /proc/self/fd/
total 0
dr-x------ 2 username username  0 Nov  8 19:01 ./
dr-xr-xr-x 9 username username  0 Nov  8 19:01 ../
lrwx------ 1 username username 64 Nov  8 19:01 0 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 1 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 2 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 3 -> 'socket:[8239772]'
lr-x------ 1 username username 64 Nov  8 19:01 4 -> /proc/29512/fd/
  1. 所有这些东西意味着什么?
  2. 软盘在这里如何工作?
  3. 什么是/dev/pts/6,为什么01, 以及2所有都指向它?
  4. 什么是'socket:[8239772]'
  5. 什么是/proc/29512/fd/
  6. 的历史用途和描述是什么/dev/fd

有关的:

  1. 我之前的问题启发我提出这个问题:'-sh:语法错误:尝试使用“bash”在嵌入式 Linux 设备上进行进程替换时出现意外的“(”'

答案1

所有这些东西意味着什么?

/proc是一个文件系统,内核通过它报告各种信息到流程。它主要用于有关进程的信息,因此名称为“proc[esses]”。对于每个正在运行的进程,都有一个子目录,/proc/<PID>其中<PID>包含进程 ID。

/proc/self是一个“神奇”的符号链接始终指向正在访问的进程/proc

/proc/self/fd报告进程打开的文件。每个条目都是一个“神奇”的符号链接,其名称是文件描述符其目标是打开的文件。它的神奇之处在于,链接实际上指向文件本身,即使通过调用获得的文件名readlink不是有效的文件名,例如,对于没有名称的文件(例如匿名管道),也会发生这种情况和套接字),并删除文件。

lrwx------ 1 username username 64 Nov  8 19:01 0 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 1 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 2 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 3 -> 'socket:[8239772]'
lr-x------ 1 username username 64 Nov  8 19:01 4 -> /proc/29512/fd/

软盘在这里如何工作?

不涉及软盘。缩写“fd”代表文件描述符

什么是/dev/pts/6,为什么01, 以及2所有都指向它?

文件描述符012是三个标准流)所有程序都希望找到:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。这些流由它们的编号定义:stdin 根据定义是文件描述符 0,其常规作用是接收用户输入或输入数据,同样对于 stdout(1,用户输出或输出数据)和 stderr(2,错误消息) 。

/dev/pts/6是一个终端。它是进程用于从该特定终端读取输入并将输出写入该特定终端的文件。当您在终端中“正常”运行程序时,stdin、stdout 和 stderr 都连接到终端。

什么是'socket:[8239772]'

它是插座。文件描述符 3 没有标准角色,因此它特定于您正在使用的某些软件,也许是您的终端模拟器。你可以看看插座的另一端有什么如果你好奇的话。

什么是/proc/29512/fd/

当您运行时ls /proc/self/fd/ls程序将打开/proc/self/fd并读取其内容。由于文件描述符 0 到 3 在ls启动时已经打开,并open使用第一个可用的文件描述符,/proc/self/fd因此最终在文件描述符 4 上打开。它与 PID 一起出现,因为内核不会通过内部跟踪访问/proc/self:它会记住它们作为特定进程的/proc目录,然后使用正确的 PID 打印出来。 (和PID命名空间,PID 以及路径可能会有所不同,具体取决于正在查找的进程。)

的历史用途和描述是什么/dev/fd

当程序需要文件名并且您想要引用已打开的文件时,它非常有用。它是/dev/stdin/dev/stdout和的概括,/dev/stderr分别相当于/dev/fd/0/dev/fd/1/dev/fd/2(并且在更一般的/dev/fd出现之前就已经存在)。它在许多 Unix 变体上都可用

相关内容