Встановлює або знімає консультативну блокування на відкритому файлі, вказаному в fd. Аргумент operation може містити одне з наступних значень: LOCK_SH Встановити загальну (shared) блокування. Загальну блокування на заданий файл може утримувати більш ніж один процес. LOCK_EX Встановити ексклюзивну (exclusive) блокування. Тільки один процес може утримувати ексклюзивну блокування файлу. LOCK_UN Видалити існуючу блокування, утримувану даним процесом.
Виклик flock () може бути блокований, якщо несумісний тип блокування вже утримується іншим процесом. Щоб виконати неблокірующій запит, додайте LOCK_NB (через операцію АБО) до одного з вищеописаних значень.
Один файл не може мати одночасно і загальну і ексклюзивну блокування.
Блокування, створені flock (), асоціюються з дескриптором відкритого файлу (дивіться open (2)). Це означає, що дублюючі файлові дескриптори (створені, наприклад, викликами fork (2) або dup (2)) вказують на одну блокування, і це блокування може бути змінена або знята при використанні будь-якого з цих файлових дескрипторів. Також, блокування звільняється або через явне виконання операції LOCK_UN на одному з дублюючих файлових дескрипторів, або коли всі такі файлові дескриптори будуть закриті.
Якщо процес використовує open (2) (або подібний виклик) для отримання більш одного файлового дескриптора на один і той же файл, то ці файлові дескриптори вважаються flock () незалежними. Спроба заблокувати файл за допомогою одного з цих файлових дескрипторів може бути припинена через блокування, яку викликає процес уже встановив через інший файловий дескриптор.
Процес може утримувати на файлі тільки один з типів блокування (загальну або ексклюзивну). Наступні виклики flock () на вже заблокований файл будуть перетворювати поточну блокування до нового заданим режимом блокування.
Блокування, створені flock (), зберігаються при виконанні execve (2).
Загальна або ексклюзивна блокування може бути встановлена на файл незалежно від режиму, в якому цей файл був відкритий.
ПОВЕРНЕНЕ ЗНАЧЕННЯ
При успішному виконанні повертається 0. У разі помилки повертається -1, а errno встановлюється відповідним чином змінити значення.
EBADFfd не є відкритим файловим дескриптором. EINTR При очікуванні отримання блокування виклик був перерваний сигналом, які прийшли в обробник; см. signal (7). EINVAL Некоректна operation. ENOLCK Ядра не вистачило пам'яті для створення запису блокування. EWOULDBLOCK Файл блокований і було вказано прапор LOCK_NB.
ВІДПОВІДНІСТЬ СТАНДАРТАМ
4.4BSD (вперше виклик flock () з'явився в 4.2BSD). Виклик flock () є в більшості систем UNIX, можливо реалізований за допомогою fcntl (2).
Починаючи з версії ядра 2.0, flock () реалізований як самостійний системний виклик, а не як емуляція в бібліотеці GNU C за допомогою fcntl (2). У цій реалізації не існує ніякого взаємодії між типами блокувань, що встановлюються flock () і fcntl (2), і flock () не може виявити взаємні блокування (зауважимо, що в деяких системах, таких як сучасні BSD, виклики flock () і fcntl (2 ) блокують, при взаємодії один з одним).
В ядрах Linux до версії 2.6.11, flock () не блокує файли по NFS (т. Е. Охоплення блокування обмежений локальною системою). Замість нього можна використовувати блокування області байт fcntl (2), яка працює по NFS, але доступна в значно пізніших версіях Linux, і сервер також повинен підтримувати блокування. Починаючи з Linux 2.6.12, клієнти NFS підтримують блокування flock (), емулюючи їх через блокування області байт для всього файлу. Це означає, що блокування fcntl (2) і flock () взаємодіють один з одним через NFS. Починаючи з Linux 2.6.37, ядро підтримує режим сумісності дає змогу вважати блокування flock () (а також блокування області байт fcntl (2)) локальними; дивіться опис параметра local_lock в nfs (5).
flock () встановлює тільки консультативні блокування; маючи відповідні права на файл, процес може ігнорувати використання flock () і виконувати над файлом операції введення / виводу.
flock () і fcntl (2) мають різну семантику для породжених процесів і dup (2). В системах, де реалізований flock () за допомогою fcntl (2), семантика flock () буде відрізнятися від описаної в даній довідкової сторінці.
При перетворенні блокування (загальну в ексклюзивну або навпаки) не гарантовано атомарность операції: спочатку існуюча блокування видаляється, а потім встановлюється нова. Між цими двома діями інший процес, який чекає запит на блокування, може отримати на неї дозвіл, в наслідок чого перетворення або заблокується, або завершиться невдало, якщо було вказано прапор LOCK_NB. (Це оригінальне поведінку BSD зустрічається у багатьох інших реалізаціях.)