Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 13 стр.

UptoLike

Составители: 

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