文件描述符47有什么用?

文件描述符47有什么用?

我注意到当我跑步时

ls /proc/self/fd

我得到以下输出:

0  1  2  3  47

显然,01和分别是、和2的描述符, 和是用于访问目录的描述符。stdinstdoutstderr3ls

但什么是47?它必须是 shell 传递的东西(而不是特定于 的东西ls),因为运行cat输出:

$ cat /proc/self/fd/47
cat: /proc/self/fd/47: Permission denied

# example of running cat on a non-existent file descriptor
$ cat /proc/self/fd/46
cat: /proc/self/fd/46: No such file or directory

ls -l说它连接到anon_inode:inotify.

我正在使用带有 KDE 的 Arch Linux,这似乎很重要,因为如果我从 tty 运行命令,这似乎不会发生。它不是特定于 shell 的(它发生在 和 上bashzsh,尽管它可能是特定于终端的(我正在使用 Konsole)。无论如何,shell 不是应该在 exec 之前关闭除 0-2 之外的所有描述符(或者将它们标记为O_CLOEXEC)吗?

我正在运行 KDE Plasma 5.27.10。

编辑:由于sudo关闭了除 0-2 之外的所有描述符,我进行了测试sudo konsole,并且此新终端内的实例zsh不会将描述符泄漏47到新进程中。这意味着 Konsole 本身没有任何问题,但它从其父级(看起来是plasmashell)接收描述符。

答案1

FD 47 没有什么特别之处。至少没有什么标准。

当打开文件描述符时,可以设置一个标志,指示是否应该在对另一个程序的 exec() 调用时关闭它。大多数程序会忽略前 3 个(有时是 4 个)以上的任何打开的文件描述符,因此,如果某个文件保持打开状态并将其标记为在 exec 中保持打开状态,则它可以通过多个程序保持打开状态。很可能,它被错误地打开了;这是一个文件描述符泄漏错误。追踪其打开的内容可能很困难,特别是考虑到打开的内容可能不再运行。

您可能看不到它从终端中的 shell 打开,因为某些 shell 会小心地关闭所有无关的打开文件描述符,以便在初始化过程中进行清理。无意中泄露文件描述符可能是一个安全漏洞,因为泄露的 FD 可能携带可能无意中泄露给另一个程序的数据。

这在更改用户时尤其危险,因此 sudo 关闭任何额外的内容是有意义的。

相关内容