get_robust_list, set_robust_list -
возвращает/назначает
список
надёжных
фьютексов
(futexes)
Standard C library (
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);
Note: glibc provides no wrappers for these system calls, necessitating
the use of
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.
These system calls are not needed by normal applications.
В нити
может быть
только
один
список
надёжных
фьютексов;
поэтому
приложения,
которым
требуется
данное
свойство,
должны
использовать
мьютексы,
предоставляемые
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 <
[email protected]>, Dmitry Bolkhovskikh
<
[email protected]>, Vladislav <
[email protected]>,
Yuri Kozlov <
[email protected]> и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]