flockfile, ftrylockfile, funlockfile -
блокирует FILE
для stdio
Standard C library (
libc,
-lc)
#include <stdio.h>
void flockfile(FILE *filehandle);
int ftrylockfile(FILE *filehandle);
void funlockfile(FILE *filehandle);
Все
функции,
показанные
выше:
/* Since glibc 2.24: */ _POSIX_C_SOURCE >= 199309L
|| /* glibc <= 2.23: */ _POSIX_C_SOURCE
|| /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
Функции stdio
можно без
опаски
использовать
в нитях. Это
достигается
назначением
каждому
объекту
FILE
счётчика
блокировок
и (если
счётчик не
равен нулю)
нити-владельца.
При каждом
библиотечном
вызове эти
функции
ждут
разблокировки
объекта
FILE
другой
нитью,
блокируют
его, а затем
выполняют
заданную
операцию
ввода/вывода
и
разблокируют
объект.
(Замечание:
блокировка
не
учитывается,
если
блокировка
файла
осуществлялась
функциями
типа
flock(2) и
lockf(3).)
Всё это
прозрачно
и
незаметно
для
программиста
на С, но всё
же есть две
причины
для более
подробного
изучения.
Первая:
возможны
последовательности
операций
ввода/вывода
в одной
нити, при
этом
другая
нить не
будет
прерывать
ввод/вывод.
Вторая:
можно
избежать
чрезмерной
нагрузки
от
блокировок.
С этой
целью нить
может явно
блокировать
объект
FILE,
осуществить
серию
операций
ввода/вывода,
а затем
снять
блокировку.
При этом
другие
нити не
могут
вклиниться
между
операциями.
Если
причиной
для
реализации
всего
этого
является
повышение
эффективности
работы, то
для
ввода/вывод
можно
использовать
неблокирующие
версии
функций stdio:
getc_unlocked(3) и
putc_unlocked(3)
вместо
getc(3) и
putc(3).
Функция
flockfile()
ожидает,
пока
*filehandle не
разблокируется
другой
нитью,
затем
делает
текущую
нить
владельцем
*filehandle и
увеличивает
счётчик
блокировок.
Функция
funlockfile()
уменьшает
счётчик
блокировок.
Функция
ftrylockfile()
является
неблокирующей
версией
flockfile().
Она ничего
не делает в
том случае,
если
другая
нить
владеет
*filehandle,
в
противном
случае
устанавливает
статус
владельца
и
увеличивает
счётчик
блокировок.
При
успешном
выполнении
функция
ftrylockfile()
возвращает
ноль (была
получена
блокировка)
или
ненулевое
значение
при
ошибках.
Нет.
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
flockfile(), ftrylockfile(), funlockfile() |
Безвредность
в нитях |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
Эти
функции
доступны,
если
определено
_POSIX_THREAD_SAFE_FUNCTIONS.
unlocked_stdio(3)
Русский
перевод
этой
страницы
руководства
был сделан
Azamat Hackimov <
[email protected]>, Dmitry Bolkhovskikh
<
[email protected]>, Yuri Kozlov <
[email protected]> и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]