使用 prctl(PR_SET_PTRACER, pid,0,0,0) 允许获取 fd

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

我一直在使用 sendmsg/recvmsg 和 cmsg 辅助数据将 fd 从一个进程发送到另一个进程(参见 man cmsg)。现在有一段时间了,还有另一种方法可以做到这一点:

https://copyconstruct.medium.com/seamless-file-descriptor-transfer-between-processes-with-pidfd-and-pidfd-getfd-816afcd19ed4

另见:man {pidfd_open, pidfd_getfd}

发现一个进程只能在一定的限制下才能获取另一个进程的fd,否则会出现EPERM错误。 我通过允许进程(接收 fd 的 pida)访问进程(pidb,让 fd 复制)来解决这个问题:

prctl(PR_SET_PTRACER, pida, 0, 0, 0)

现在带有 pid pida 的进程可以通过以下方式获得所需的 pid:

fdtmp=syscall(SYS_pidfd_open, pidb, 0);
if (fdtmp>=0) {
   fda=syscall(SYS_pidfd_getfd, fdtmp, fdb, 0);
   close(fdtmp);
}

现在 fda 是指向同一个套接字的文件描述符。

这行得通,但我认为这样我给进程 pida 太多的特权(使用命名的 prctl 命令)。还有别的办法吗? 提前致谢, 史蒂夫邦

c linux pid file-descriptor ptrace
© www.soinside.com 2019 - 2024. All rights reserved.