---
name: "set_robust_list"
section: "2"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/get_robust_list"
---

# set\_robust\_list(2)

get/set list of robust futexes

Part of [get\_robust\_list(2)](/get_robust_list/2.md).

## NAME

get\_robust\_list, set\_robust\_list - get/set list of robust futexes

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <linux/futex.h>   /* Definition of struct robust_list_head */
#include <sys/syscall.h>   /* Definition of SYS_* constants */
#include <unistd.h>
```

**long syscall(SYS\_get\_robust\_list, int** *pid***,**              **struct robust\_list\_head \*\****head\_ptr***, size\_t \****sizep***);** **long syscall(SYS\_set\_robust\_list,**              **struct robust\_list\_head \****head***, size\_t** *size***);**

*Note*: glibc provides no wrappers for these system calls, necessitating the use of [**syscall**(2)](/syscall/2.md).

## DESCRIPTION

These system calls deal with per-thread robust futex lists. These lists are managed in user space: the kernel knows only about the location of the head of the list. A thread can inform the kernel of the location of its robust futex list using **set\_robust\_list**(). The address of a thread's robust futex list can be obtained using **get\_robust\_list**().

The purpose of the robust futex list is to ensure that if a thread accidentally fails to unlock a futex before terminating or calling [**execve**(2)](/execve/2.md), another thread that is waiting on that futex is notified that the former owner of the futex has died. This notification consists of two pieces: the **FUTEX\_OWNER\_DIED** bit is set in the futex word, and the kernel performs a [**futex**(2)](/futex/2.md) **FUTEX\_WAKE** operation on one of the threads waiting on the futex.

The **get\_robust\_list**() system call returns the head of the robust futex list of the thread whose thread ID is specified in *pid*. If *pid* is 0, the head of the list for the calling thread is returned. The list head is stored in the location pointed to by *head\_ptr*. The size of the object pointed to by *\*\*head\_ptr* is stored in *sizep*.

Permission to employ **get\_robust\_list**() is governed by a ptrace access mode **PTRACE\_MODE\_READ\_REALCREDS** check; see [**ptrace**(2)](/ptrace/2.md).

The **set\_robust\_list**() system call requests the kernel to record the head of the list of robust futexes owned by the calling thread. The *head* argument is the list head to record. The *size* argument should be *sizeof(\*head)*.

## RETURN VALUE

The **set\_robust\_list**() and **get\_robust\_list**() system calls return zero when the operation is successful, an error code otherwise.

## ERRORS

The **set\_robust\_list**() system call can fail with the following error:

- **EINVAL**

  *size* does not equal *sizeof(struct robust\_list\_head)*.

The **get\_robust\_list**() system call can fail with the following errors:

- **EFAULT**

  The head of the robust futex list can't be stored at the location *head*.

- **EPERM**

  The calling process does not have permission to see the robust futex list of the thread with the thread ID *pid*, and does not have the **CAP\_SYS\_PTRACE** capability.

- **ESRCH**

  No thread with the thread ID *pid* could be found.

## VERSIONS

These system calls were added in Linux 2.6.17.

## NOTES

These system calls are not needed by normal applications.

A thread can have only one robust futex list; therefore applications that wish to use this functionality should use the robust mutexes provided by glibc.

In the initial implementation, a thread waiting on a futex was notified that the owner had died only if the owner terminated. Starting with Linux 2.6.28, notification was extended to include the case where the owner performs an [**execve**(2)](/execve/2.md).

The thread IDs mentioned in the main text are *kernel* thread IDs of the kind returned by [**clone**(2)](/clone/2.md) and [**gettid**(2)](/gettid/2.md).

## SEE ALSO

[**futex**(2)](/futex/2.md), [**pthread\_mutexattr\_setrobust**(3)](/pthread_mutexattr_setrobust/3.md)

*Documentation/robust-futexes.rst* and *Documentation/robust-futex-ABI.rst* in the Linux kernel source tree
