Главная » 2017 » Ноябрь » 19 » man 2 get_robust_list
22:28
man 2 get_robust_list

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


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



ОБЗОР


#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 нет обёрточных функций для этих системных вызовов; смотрите
ЗАМЕЧАНИЯ.



ОПИСАНИЕ


Данные системные вызовы служат для ведения понетевых списков надёжных фьютексов.
Данные списки управляются из пользовательского пространства: ядро знает только
расположение начала списка. Нить может информировать ядро о расположении своего
списка надёжных фьютексов с помощью 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() может завершиться со следующими ошибками:

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

В маловероятном случае, когда вы хотите вызвать их напрямую, используйте
syscall(2).

В нити может быть только один список надёжных фьютексов; поэтому приложения,
которым требуется данное свойство, должны использовать мьютексы, предоставляемые
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



Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 354 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar