ВУЗ:
Составители:
13
выполнении функция fcntl возвращает текущее значение флага;
int F_SETFL Используется для установки значения флага. При этом вызов fcntl
выглядит следующим образом:
fcntl (FILEDES, F_SETFL, NEW-FLAGS)
Аргумент NEW-FLAGS имеет тип int.
Приведем пример изменения флага состояния файла:
int
set_nonblock_flag (int desc, int value)
{
int oldflags = fcntl (desc, F_GETFL, 0);
/* если произошла ошибка, выходим из программы */
if (oldflags == -1)
return -1;
/* устанавливаем только нужный флаг */
if (value != 0)
oldflags |= O_NONBLOCK;
else
oldflags &= ~O_NONBLOCK;
/* сохраняем флаг в дескрипторе файла */
return fcntl (desc, F_SETFL, oldflags);
}
Захват файла
Команды fcntl используются для поддержки «захвата записей», которая
позволяет одновременно работающим программам независимо использовать только
части одного и того же файла.
Исключительный захват или захват на запись дают процессу доступ на запись в
заданный участок файла. Пока участок файла захвачен никакой другой процесс не
может этот участок на запись. Разделяемый захват или захват на чтение запрещает
установку каким-либо процессом захвата участка файла на запись. Однако любое
количество процессов могут захватывать участок на чтение.
Функции read и write не проверяют существует ли в настоящий момент какой-
либо захват. Поэтому для реализации протокола захвата для файла, разделяемого
многими процессами, необходимо выполнять явные вызовы fcntl для запроса и
освобождения захватов.
Захваты ассоциируются с процессами. Процесс может иметь только один тип
захвата для каждого байта файла. Когда любой дескриптор файла закрывается
процессом, то все захваты освобождаются даже в том случае, если они выполнялись
через другие дескрипторы. Захваты освобождаются когда процесс закрывается и не
наследуются процессами, созданными с помощью функции fork.
Для задания захвата используется структура flock, которая специфицирует тип
захвата и другие параметры. Структура и соответствующие макросы описаны в
заголовочном файле <fcntl.h>.
struct flock {
short int l_type;
short int l_whence;
off_t l_start;
off_t l_len;
pid_t l_pid;
};
Приведем значения полей структуры.
l_type Задает тип захвата. Может принимать значения F_RDLCK, F_WRLC
K
или F_UNLCK;
l_whence Соотвествует аргументу WHENCE функции lseek. Может принимать
значения SEEK_SET', SEEK_CUR или SEEK_END;
выполнении функция fcntl возвращает текущее значение флага;
int F_SETFL Используется для установки значения флага. При этом вызов fcntl
выглядит следующим образом:
fcntl (FILEDES, F_SETFL, NEW-FLAGS)
Аргумент NEW-FLAGS имеет тип int.
Приведем пример изменения флага состояния файла:
int
set_nonblock_flag (int desc, int value)
{
int oldflags = fcntl (desc, F_GETFL, 0);
/* если произошла ошибка, выходим из программы */
if (oldflags == -1)
return -1;
/* устанавливаем только нужный флаг */
if (value != 0)
oldflags |= O_NONBLOCK;
else
oldflags &= ~O_NONBLOCK;
/* сохраняем флаг в дескрипторе файла */
return fcntl (desc, F_SETFL, oldflags);
}
Захват файла
Команды fcntl используются для поддержки «захвата записей», которая
позволяет одновременно работающим программам независимо использовать только
части одного и того же файла.
Исключительный захват или захват на запись дают процессу доступ на запись в
заданный участок файла. Пока участок файла захвачен никакой другой процесс не
может этот участок на запись. Разделяемый захват или захват на чтение запрещает
установку каким-либо процессом захвата участка файла на запись. Однако любое
количество процессов могут захватывать участок на чтение.
Функции read и write не проверяют существует ли в настоящий момент какой-
либо захват. Поэтому для реализации протокола захвата для файла, разделяемого
многими процессами, необходимо выполнять явные вызовы fcntl для запроса и
освобождения захватов.
Захваты ассоциируются с процессами. Процесс может иметь только один тип
захвата для каждого байта файла. Когда любой дескриптор файла закрывается
процессом, то все захваты освобождаются даже в том случае, если они выполнялись
через другие дескрипторы. Захваты освобождаются когда процесс закрывается и не
наследуются процессами, созданными с помощью функции fork.
Для задания захвата используется структура flock, которая специфицирует тип
захвата и другие параметры. Структура и соответствующие макросы описаны в
заголовочном файле .
struct flock {
short int l_type;
short int l_whence;
off_t l_start;
off_t l_len;
pid_t l_pid;
};
Приведем значения полей структуры.
l_type Задает тип захвата. Может принимать значения F_RDLCK, F_WRLCK
или F_UNLCK;
l_whence Соотвествует аргументу WHENCE функции lseek. Может принимать
значения SEEK_SET', SEEK_CUR или SEEK_END;
13
Страницы
- « первая
- ‹ предыдущая
- …
- 11
- 12
- 13
- 14
- 15
- …
- следующая ›
- последняя »
