/proc/[pid]/fd/[0, 1, 2]:没有这样的文件或设备 - 即使文件存在

/proc/[pid]/fd/[0, 1, 2]:没有这样的文件或设备 - 即使文件存在

我正在尝试stdio从其父进程外部访问进程的流。我已经找到了该/proc/[pid]/fd目录,但是当我尝试时

$ cat /proc/[pid]/fd/1

我收到一个No such file or device错误。我确信它存在,正如 Dolphin(文件浏览器)所显示的那样。

我也碰巧注意到文件资源管理器将其列为插座并尝试按照建议阅读这里产生类似的错误。这对我来说很奇怪,因为stdio流通常是管道,而不是套接字,所以我不确定这里发生了什么。

我还想指出,这些进程是由同一用户启动的,并且尝试访问它sudo也不起作用。如果这个问题看起来很幼稚,我深表歉意,但我真诚地感谢一些指导 - 也许有更好的方法来访问 stdio 管道?

答案1

太长;博士;截至 2020 年,如果/proc/<pid>/fd/<fd>是套接字,则无法执行此操作(或类似操作)。

进程的stdin、stdout、stderr可以是任何类型的文件,不一定是管道、常规文件等。它们也可以是套接字。

在 Linux 上,它们/proc/<pid>/fd/<fd>是一种特殊的符号链接,允许您打开从头开始文件描述符引用的实际文件,即使该文件已被删除,或者它根本不存在于任何文件系统中(例如使用 创建的文件memfd_create(2)),也会执行此操作。

但是套接字是一个值得注意的例外,它们不能以这种方式打开(也不明显如何实现:如果该 fd 是一个已连接的套接字,那么open()on/proc/<pid>/fd/<fd>会创建另一个到服务器的连接吗?如果套接字是显式的怎么办?绑定到本地端口?)。

最近版本的 Linux 内核引入了一个新的系统调用,pidfd_getfd(2),它允许您从另一个进程“窃取”文件描述符,就像您能够通过 Unix 套接字传递文件描述符一样,但无需受害进程的协作。但这还没有在大多数 Linux 发行版中实现。

相关内容