- bullseye-backports 4.18.1-1~bpo11+1
- testing 4.18.1-1
- unstable 4.18.1-1
GET_ROBUST_LIST(2) | Системные вызовы Linux | GET_ROBUST_LIST(2) |
ИМЯ¶
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() может завершиться со следующими ошибками:
ВЕРСИИ¶
Данные системные вызовы были добавлены в Linux 2.6.17.
ЗАМЕЧАНИЯ¶
Эти системные вызовы не нужны обычным приложениям. Поддержка в glibc отсутствует. В маловероятном случае, когда вы хотите вызвать их напрямую, используйте 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
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
10 октября 2019 г. | Linux |