我一直在使用 sendmsg/recvmsg 和 cmsg 辅助数据将 fd 从一个进程发送到另一个进程(参见 man cmsg)。现在有一段时间了,还有另一种方法可以做到这一点:
另见: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 命令)。还有别的办法吗? 提前致谢, 史蒂夫邦