遵循规范

pidfd_getfd()是Linux特定的。

返回值

成功后,pidfd_getfd()返回文件描述符(非负整数)。发生错误时,将返回-1并将errno设置为指示错误原因。

语法

int pidfd_getfd(int pidfd, int targetfd, unsigned int flags);

说明

pidfd_getfd()系统调用在调用过程中分配一个新的文件描述符。在PID文件描述符pidfd引用的过程中,此新文件描述符是现有文件描述符targetfd的副本。

在pidfd引用的过程中,重复文件描述符引用与原始文件描述符相同的打开文件描述(请参阅open(2))。因此,这两个文件描述符共享文件状态标志和文件偏移量。此外,对底层文件对象的操作(例如,使用bind(2)将地址分配给套接字对象)可以同样地通过重复文件描述符执行。

pidfd_getfd()返回的文件描述符上设置了close-on-exec标志(FD_CLOEXEC;参见fcntl(2))。

flags参数保留供将来使用。当前,必须将其指定为0。

复制另一个进程的文件描述符的权限由ptrace访问模式PTRACE_MODE_ATTACH_REALCREDS检查控制(请参阅ptrace(2))。

备注

当前,此系统调用没有glibc包装器。使用syscall(2)调用它。

有关PID文件描述符的描述,请参见pidfd_open(2)。

pidfd_getfd()的作用类似于unix(7)中描述的SCM_RIGHTS消息的使用,但在以下方面有所不同:

*
为了使用SCM_RIGHTS消息传递文件描述符,两个进程必须首先建立UNIX域套接字连接。
*
使用SCM_RIGHTS需要在复制文件描述符的过程中进行合作。相比之下,使用pidfd_getfd()时不需要这种合作。
*
使用pidfd_getfd()的能力受到PTRACE_MODE_ATTACH_REALCREDS ptrace访问模式检查的限制。

错误说明

EBADF
pidfd不是有效的PID文件描述符。
EBADF
在pidfd引用的过程中,targetfd不是打开的文件描述符。
EINVAL
标志不为0。
EMFILE
已达到打开文件描述符数量的每个进程限制(请参阅getrlimit(2)中RLIMIT_NOFILE的描述)。
ENFILE
已达到系统范围内打开文件总数的限制。
EPERM
调用进程对pidfd引用的进程没有PTRACE_MODE_ATTACH_REALCREDS权限(请参阅ptrace(2))。
ESRCH
pidfd引用的进程不存在(即它已终止并等待)。

版本

pidfd_getfd()首次出现在Linux 5.6中。

PIDFD_GETFD - Linux手册页

Linux程序员手册 第2部分
更新日期: 2020-03-31

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

名称

pidfd_getfd-获得另一个进程的文件描述符的副本

另外参见

clone3(2),dup(2),kcmp(2),pidfd_open(2)

日期:2019-08-20 17:59:07 来源:oir作者:oir