我知道进程的
pid
,我需要获取它使用的socketfd
,所以我在/proc/$pid/fd
中查找,例如:
$ ls -la /proc/1442/fd | grep socket
lrwx------ 1 root root 64 Jan 23 16:22 7 -> socket:[21807]
$
现在,当我将代表套接字描述符的值 7 传递给
getsockopt()
时,我收到 EBADF
错误。即使具有root权限,是否也不允许从另一个进程执行此操作?
我做错了什么?
文件描述符是每个进程的。它们不在进程之间共享。
如果要访问另一个进程拥有的文件描述符,有时可以
open()
/proc/<pid>/fd
中的路径来获取它的副本。然而,这仅适用于普通文件;它不适用于套接字。 (这个问题涉及内部细节。)
所以,简而言之,不。据我所知,没有一个进程可以在没有该进程合作的情况下从另一个进程“接管”套接字的直接方法。
在 Linux 内核中实现 open("/proc/self/fd/NUM") 的代码在哪里?
有更好的解释较新的 Linux 内核有一个
pidfd_getfd()
系统调用,它实现了跨进程 dup()
。
与
open("/proc/NNN/fd/NN", O_whatever)
不同,它可以附加到套接字,或使用其原始读写指针附加到文件。后者在写入结果 fd 时很重要。