Книга: Linux программирование в примерах
9.4.3.3. Работа с флагами статуса файла и режимами доступа
9.4.3.3. Работа с флагами статуса файла и режимами доступа
В разделе 4.6.3 «Возвращаясь к open()
» мы предоставили полный список флагов O_xx, которые принимает open()
. POSIX разбивает их по функциям, классифицируя в соответствии с табл. 9.4.
Таблица 9.4. Флаги O_xx для open()
, creat()
и fcntl()
Категория | Функции | Флаги |
---|---|---|
Доступ к файлу | open() , fcntl() |
O_RDONLY , O_RDWR , O_WRONLY |
Создание файла | open() |
O_CREAT , O_EXCL , O_NOCTTY , O_TRUNC |
Статус файла | open() , fcntl() |
O_APPEND , O_DSYNC , O_NONBLOCK , O_RSYNC , O_SYNC |
Помимо первоначальной установки различных флагов с помощью open()
, вы можете использовать fcntl()
для получения текущих установок, а также их изменения. Это осуществляется с помощью значений cmdF_GETFL
и F_SETFL
соответственно. Например, вы можете использовать эти команды для изменения установки неблокирующего флага, O_NONBLOCK
, подобным образом:
int fd_flags;
if ((fd_flags = fcntl(fd, F_GETFL)) < 0)
/* обработать ошибку */
if ((fd_flags & O_NONBLOCK) != 0) { /* Установлен неблокирующий флаг */
fd_flags &= ~O_NONBLOCK; /* Сбросить его */
if (fcntl(fd, F_SETFL, fd_flags) != 0) /* Дать ядру новое значение */
/* обработать ошибку */
}
Помимо самих режимов именованная константа O_ACCMODE
является маской, которую вы можете использовать для выделения из возвращаемого значения режимов прав доступа.
fd_flags = fcntl(fd, F_GETFL);
switch (fd_flags & O_ACCESS) {
case O_RDONLY:
/* ...действия только для чтения... */
break;
case O_WRONLY:
/* ...действия только для записи... */
break;
case O_RDWR:
/* ...действия для чтения и записи... */
break;
}
POSIX требует, чтобы O_RDONLY
, O_RDWR
и O_WRONLY
были побитово различными, таким образом, гарантируется, что код, подобный только что показанному, будет работать и является простым способом определения того, как был открыт произвольный дескриптор файла.
Используя F_SETFL
вы можете также изменить эти режимы, хотя по-прежнему применяется проверка прав доступа. Согласно справочной странице GNU/Linux fcnlt(2) флаг O_APPEND
не может быть сброшен, если он использовался при открытии файла.
- 9.4.3. Управление атрибутами файла: fcntl()
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Лекция 15. Работа с базами данных
- Работа с ресурсами локальной сети
- Эффективная работа с временными файлами сортировки
- Ускоренная работа с индексами
- HR-брендинг: Работа с поколением Y, новые инструменты для коммуникации, развитие корпоративной культуры и еще 9 эффектив...
- Безопасная работа с внешними таблицами
- Работа со строками
- Единое имя файла параметров InterBase
- Параметры конфигурационного файла InterBase
- 9.2. Работа прокси-сервера