Книга: 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 не может быть сброшен, если он использовался при открытии файла.

Оглавление книги


Генерация: 1.324. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз