来自 /proc/$PID/fd 的套接字 fd 似乎无效

问题描述 投票:0回答:3

我知道进程的

pid
,我需要获取它使用的socket
fd
,所以我在
/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权限,是否也不允许从另一个进程执行此操作?

我做错了什么?

linux sockets linux-kernel
3个回答
1
投票

文件描述符是每个进程的。它们不在进程之间共享。

如果要访问另一个进程拥有的文件描述符,有时可以

open()
/proc/<pid>/fd
中的路径来获取它的副本。然而,这仅适用于普通文件;它不适用于套接字。 (这个问题涉及内部细节。

所以,简而言之,不。据我所知,没有一个进程可以在没有该进程合作的情况下从另一个进程“接管”套接字的直接方法。


0
投票

看来你可以“接管”root 套接字,看:


0
投票

Linux 内核中实现 open("/proc/self/fd/NUM") 的代码在哪里?

有更好的解释

较新的 Linux 内核有一个

pidfd_getfd()
系统调用,它实现了跨进程
dup()

open("/proc/NNN/fd/NN", O_whatever)
不同,它可以附加到套接字,或使用其原始读写指针附加到文件。后者在写入结果 fd 时很重要。

© www.soinside.com 2019 - 2024. All rights reserved.