get_robust_list(2)

НАИМЕНОВАНИЕ
get_robust_list, set_robust_list - возвращает/назначает список надёжных фьютексов (futexes)

БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)

ОБЗОР
#include <linux/futex.h>   /* определения struct robust_list_head */
#include <sys/syscall.h>   /* определения констант SYS_* */
#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);

Примечание: glibc не предоставляет обёрточных функций для этих системных вызовов, что делает необходимым использование syscall(2).

ОПИСАНИЕ
Данные системные вызовы служат для ведения понетевых списков надёжных фьютексов. Данные списки управляются из пользовательского пространства: ядро знает только расположение начала списка. Нить может информировать ядро о расположении своего списка надёжных фьютексов с помощью set_robust_list(). Адрес списка надёжных фьютексов нити можно получить с помощью get_robust_list().

Предназначением списка надёжных фьютексов является гарантия того, что если нить неожиданно из-за ошибки не разблокирует фьютекс перед завершением или вызовом execve(2), другая ожидающая этот фьютекс нить получит уведомление о том, что бывший владелец фьютекса прекратил работу. Данное уведомление состоит из двух частей: установленного бита FUTEX_OWNER_DIED в слове фьютекса и выполнение ядром futex(2) с операцией FUTEX_WAKE для одной из нитей, ожидающих фьютекс.

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.

Право вызывать get_robust_list() определяется проверкой режима доступа ptrace PTRACE_MODE_READ_REALCREDS; смотрите ptrace(2).

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).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Системные вызовы set_robust_list() и get_robust_list() возвращают ноль при успешном выполнении и код ошибки в противном случае.

ОШИБКИ
Системный вызов pthread_setcancelstate() может завершиться со следующей ошибкой:

EINVAL
    size does not equal sizeof(struct robust_list_head).

Системный вызов get_robust_list() может завершиться со следующими ошибками:

EFAULT
    Начало списка надёжных фьютексов невозможно сохранить в расположение head.

EPERM
    Вызывающий процесс не имеет прав на просмотр списка надёжных фьютексов нити с идентификатором pid и не имеет мандата CAP_SYS_PTRACE.

ESRCH
    Нить с идентификатором pid не найдена.

ВЕРСИИ
Данные системные вызовы были добавлены в Linux 2.6.17.

ПРИМЕЧАНИЯ
Данные системные вызовы не нужны обычным приложениям.

В нити может быть только один список надёжных фьютексов; поэтому приложения, которым требуется данное свойство, должны использовать мьютексы, предоставляемые glibc.

В первоначальной реализации нить, ожидающая фьютекс, уведомлялась о кончине владельца только, если владелец прекращал работу. Начиная с Linux 2.6.28 уведомление также посылается при выполнении владельцем execve(2).

Идентификаторы нитей, упоминаемые в основном тексте, являются ядерными идентификаторами нити, которые возвращаются из clone(2) и gettid(2).

СМОТРИТЕ ТАКЖЕ
futex(2), pthread_mutexattr_setrobust(3)

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

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).