另外参见

futex(2),pthread_mutexattr_setrobust(3)

Linux内核源代码树中的Documentation / robust-futexes.txt和Documentation / robust-futex-ABI.txt

返回值

操作成功时,set_robust_list()和get_robust_list()系统调用将返回零,否则返回错误代码。

备注

普通应用程序不需要这些系统调用。 glibc不提供对它们的支持。如果您想直接调用它们,请使用syscall(2)。

一个线程只能有一个健壮的futex列表。因此,希望使用此功能的应用程序应使用glibc提供的强大互斥体。

在最初的实现中,仅当所有者终止时,才通知等待线程的线程所有者已死亡。从Linux 2.6.28开始,通知已扩展为包括所有者执行execve(2)的情况。

正文中提到的线程ID是clone(2)和gettid(2)返回的那种内核线程ID。

语法

#include <linux/futex.h>
#include <sys/types.h>
#include <syscall.h>

long get_robust_list(int pid, struct robust_list_head **head_ptr,
                     size_t *len_ptr);
long set_robust_list(struct robust_list_head *head, size_t len);

注意:这些系统调用没有glibc包装器。请参阅注释。

名称

get_robust_list,set_robust_list-获取/设置健壮烟气的列表

出版信息

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

版本

这些系统调用是在Linux 2.6.17中添加的。

GET_ROBUST_LIST - Linux手册页

Section: Linux System Calls (2)
更新日期: 2019-10-10

错误说明

set_robust_list()系统调用可能因以下错误而失败:

EINVAL
len不等于sizeof(struct Robust_list_head)。

系统调用get_robust_list()可能因以下错误而失败:

EFAULT
健壮的futex列表的头不能存储在位置头。
EPERM
调用进程无权查看具有线程ID pid的线程的健壮的futex列表,并且不具有CAP_SYS_PTRACE功能。
ESRCH
找不到具有线程ID pid的线程。

说明

这些系统调用处理每个线程的健壮的futex列表。这些列表是在用户空间中管理的:内核仅知道列表头部的位置。线程可以使用set_robust_list()将其健壮的futex列表的位置通知内核。可以使用get_robust_list()获得线程健壮的futex列表的地址。

健壮的futex列表的目的是确保,如果一个线程在终止或调用execve(2)之前意外未能解锁一个futex,则将通知另一个等待该futex的线程该futex的前所有者已死亡。该通知包括两部分:在futex字中设置FUTEX_OWNER_DIED位,并且内核在等待futex的线程之一上执行futex(2)FUTEX_WAKE操作。

系统调用get_robust_list()返回线程的健壮futex列表的头部,该线程的线程ID在pid中指定。如果pid为0,则返回调用线程列表的开头。列表头存储在head_ptr指向的位置。 ** head_ptr指向的对象的大小存储在len_ptr中。

使用get_robust_list()的权限由ptrace访问模式PTRACE_MODE_READ_REALCREDS检查控制;参见ptrace(2)。

set_robust_list()系统调用请求内核记录调用线程拥有的健壮futex列表的开头。 head参数是要记录的列表头。 len参数应为sizeof(* head)。

日期:2019-08-20 17:58:46 来源:oir作者:oir