Книга: Основы программирования в Linux
fcntl
fcntl
Системный вызов fcntl
предоставляет дополнительные методы обработки низкоуровневых дескрипторов файлов:
#include <fcntl.h>
int fcntl(int fildes, int cmd);
int fcntl(int fildes, int cmd, long arg);
С помощью системного вызова fcntl
вы можете выполнить несколько разнородных операций над открытыми дескрипторами файлов, включая их дублирование, получение и установку флагов дескрипторов файлов, получение и установку флагов состояния файла и управление блокировкой файла (advisory file locking).
Различные операции выбираются разными значениями параметра команды cmd
, как определено в файле fcntl.h. В зависимости от выбранной команды системному вызову может потребоваться третий параметр arg
.
? fcntl(fildes, F_DUPFD, newfd)
— этот вызов возвращает новый дескриптор файла с числовым значением, равным или большим целочисленного параметра newfd
. Новый дескриптор — копия дескриптора fildes
. В зависимости от числа открытых файлов и значения newfd
этот вызов может быть практически таким же, как вызов dup(fildes)
.
? fcntl(fildes, F_GETFD)
— этот вызов возвращает флаги дескриптора файла, как определено в файле fcntl.h. К ним относится FD_CLOEXEC
, определяющий, закрыт ли дескриптор файла после успешного вызова одного из системных вызовов семейства exec.
? fcntl(fildes, F_SETFD, flags)
— этот вызов применяется для установки флагов дескриптора файла, как правило, только FD_CLOEXEC
.
? fcntl(fildes, F_GETFL)
и fcntl(fildes, F_SETFL, flags)
— эти вызовы применяются, соответственно, для получения и установки флагов состояния файла и режимов доступа. Вы можете извлечь режимы доступа к файлу с помощью маски O_ACCMODE
, определенной в файле fcntl.h. Остальные флаги включают передаваемые значения в третьем аргументе вызову open с использованием O_CREAT
. Учтите, что вы не можете задать все флаги. В частности, нельзя задать права доступа к файлу с помощью вызова fcntl.
Вызов fcntl
также позволяет реализовать блокировку файла. См. более подробную информацию в разделе 2 интерактивного справочного руководства или главу 7, в которой мы обсуждаем блокировку файлов.
- 14.2.2. Блокировка POSIX: fcntl() и lockf()
- 9.4.3. Управление атрибутами файла: fcntl()
- 9.4.3.5. Сводка fcntl()
- Функция fcntl(2)
- Более сложные приемы: fcntl и mmap
- 8.3. Функция fcntl(): блокировки и другие операции над файлами
- Листинг 8.2. (lock-file.c) Установка блокировки записи с помощью функции fcntl()
- 20.3.7. Вызовы ioctl(2) и fcntl(2) являются препятствиями
- 7.11. Функция fcntl
- 9.3. Блокирование записей с помощью fcntl по стандарту Posix
- Блокировка записей fcntl
- LOCK GRANT ORDER