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 *len_ptr);
long syscall(SYS_set_robust_list,
             struct robust_list_head *head, size_t len);

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

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

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

Системный вызов get_robust_list() возвращает начало списка надёжных фьютексов нити, идентификатор которой указан в pid. Если значение pid равно 0, то возвращается начало списка вызывающей нити. Начало списка сохраняется в расположение, указанное head_ptr. Размер объекта, указываемый **head_ptr, сохраняется в len_ptr.

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

Системный вызов set_robust_list() запрашивает ядро записать начало списка надёжных фьютексов, принадлежащего вызывающей нити. Аргумент head содержит начало списка для записи. Аргумент len должен быть равен sizeof(*head).

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

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

EINVAL
    Значение len не равно 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.txt и Documentation/robust-futex-ABI.txt в дереве исходного кода ядра Linux

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

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

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