int fcntl(int fildes, int cmd, long arg);
С помощью системного вызова fcntl
Различные операции выбираются разными значениями параметра команды cmd
arg.□ fcntl(fildes, F_DUPFD, newfd)
newfd. Новый дескриптор — копия дескриптора fildes. В зависимости от числа открытых файлов и значения newfd этот вызов может быть практически таким же, как вызов dup(fildes).□ fcntl(fildes, F_GETFD)
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
Система UNIX предоставляет полезное средство, позволяющее программам совместно использовать память, и, к счастью, оно включено в версию 2.0 и более поздние версии ядра Linux. Функция mmap
Вы можете применить то же самое средство для работы с файлами, заставив все содержимое файла на диске выглядеть как массив в памяти. Если файл состоит из записей, которые могут быть описаны структурами на языке С, вы сможете обновлять файл с помощью методов доступа к массиву структур.
Это становится возможным благодаря применению сегментов виртуальной памяти с набором особых прав доступа. Чтение из сегмента и запись в него заставляет операционную систему читать соответствующую часть файла на диске и писать данные в нее.
Функция mmap создает указатель на область памяти, ассоциированную с содержимым файла, доступ к которому осуществляется через открытый дескриптор файла.
#include
void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
Изменить начальную позицию порции данных файла, к которым выполняется обращение через совместно используемый сегмент, можно, передавая параметр off
fildes. Объем данных, к которым возможен доступ (т. е. размер сегмента памяти), указывается в параметре len.Параметр addr
Параметр prot
□ PROT_READ
□ PROT_WRITE
□ PROT_EXEC
□ PROT_NONE
Параметр flags
| Константа | Описание |
|---|---|
MAP_PRIVATE | Сегмент частный, изменения локальные |
MAP_SHARED | Изменения сегмента переносятся в файл |
MAP_FIXED | Сегмент должен располагаться по заданному адресу addr |
Функция msync