- •Системные вызовы ввода и вывода
- •Что такое файл?
- •Обзор - стандартные функции ввода/вывода
- •Открытие файла
- •Open(2) - Флаги
- •Права доступа к файлу
- •Открытие файла - Примеры
- •Что же делает вызов open(2)?
- •Закрытие файла
- •Чтение из файла
- •Запись в файл
- •Копирование ввода в вывод - Пример
- •Копирование ввода в вывод - пример
- •Копирование файла - Пример
- •Создание файла информации о служащих - Пример
- •Ожидание физической записи на диск
- •Перемещение позиции чтения/записи файла
- •Поддержка длинных файлов
- •Получение информации о служащих - Пример
- •Создание копии дескриптора файла
- •Что делает dup(2)
- •Перенаправление ввода/вывода - Пример
- •Перенаправление ввода/вывода - пример
- •Управление файловым дескриптором
- •Команды fcntl(2)
- •Чтение с терминала в режиме опроса - Пример: флаг o_ndelay
- •Освобождение пространства на диске
- •Освобождение пространства на диске - Пример
- •Отображение файлов на память
- •Отображение файла на память
- •Параметры mmap(2)
- •Доступ к файлу
- •Удаление отображения страниц памяти
- •Синхронизация памяти с физическим носителем
- •Отображение файла - Пример
- •Приложение - Стандартная библиотека ввода/вывода
- •Функции доступа к файлам
- •Функции состояния файла
- •Функции ввода
Освобождение пространства на диске
Команда F_FREESP вызова fcntl(2) освобождает место на диске, укорачивая файл или превращая файл в разреженный (понятие разреженного файла обсуждалось в этом разделе при описании системного вызова lseek(2)).
Следующая страница описывает структуру flock, используемую вызовом fcntl(2). Адрес такой структуры передается в качестве третьего аргумента при использовании команд F_FREESP, F_GETLK, F_SETLK или F_SETLKW. С командой F_FREESP используются только поля l_whence, l_start, l_len.
Если l_whence равно SEEK_SET (символьная константа 0), l_len байт освобождается, начиная с l_start.
Если l_whence равно SEEK_CUR (символьная константа 1), l_len байт освобождается, начиная с текущей позиции плюс l_start.
Если l_whence равно SEEK_END (символьная константа 0), l_len байт освобождается, начиная с конца файла плюс l_start.
Поле l_whence напоминает аргумент whence функции lseek(2). Также, l_start напоминает параметр offset. При l_whence, равном SEEK_CUR или SEEK_END, l_start может быть отрицательным.
Если l_len равен нулю, место освобождается от указанной точки до конца файла.
Если освобождаемый участок захватывает конец файла, то длина файла уменьшается. Если освобождаемый участок не доходит до конца файла, то образуется «дырка» в файле, то есть файл становится разреженным, но его логическая длина не изменяется.
Освобождение пространства на диске - Пример
Функция, урезающая файл, приведенная на следующей странице, напоминает библиотечную функцию truncate(3), описанную позже в этом курсе.
Программа работает следующим образом:
8-15 Для отладки функции урезания, компилируйте программу следующим
образом:
$ cc -DDEBUG truncate.c
При этом строки между #if и #endif останутся в программе.
17 Функция урезания получает два аргумента, path и len. Файл, на имя которого указывает path, укорачивается до len байт.
19 Объявляется структура flock. Адрес lck передается третьим аргументом вызову fcntl(2).
22-25 Открывается файл.
27-29 Полям структуры lck присваиваются соответствующие значения. Поскольку l_whence равно 0, l_start будет относительно начала файла. Пространство будет освобождено, начиная от l_start байт от начала файла и до конца файла (поскольку l_len равно 0).
31-35 fcntl(2) вызывается с командой F_FREESP. Третий аргумент — адрес структуры flock. Файл будет усечен до длины len. Если файл уже был короче, ничего не произойдет.
Вызов: команда wc -c x выводит количество байт в файле x. Программа truncate используется для урезания файла до 5 байт.
$ wc -c x
567 x$ truncate x 5$ wc -c x5 xФайл: truncate.cОСВОБОЖДЕНИЕ ПРОСТРАНСТВА НА НОСИТЕЛЕ - ПРИМЕР1 #include <sys/types.h>2 #include <stdio.h>3 #include <unistd.h>4 #include <stdlib.h>5 #include <fcntl.h>6 int trunc(char *, off_t);78 #if DEBUG9 main(int argc, char *argv[])10 {11 off_t len;12 len = atol(argv[2]);13 trunc(argv[1], len);14 }15 #endif1617 int trunc(char *path, off_t len)18 {19 struct flock lck;20 register fd;2122 if((fd = open(path, O_WRONLY)) == -1){23 perror(path);24 return(-1);25 }2627 lck.l_whence = SEEK_SET; /* offset from beginning of file */28 lck.l_start = len;29 lck.l_len = 0L; /* until the end of the file */3031 if(fcntl(fd, F_FREESP, &lck) == -1){32 perror("fcntl");33 close(fd);34 return(-1);35 }36 close(fd);37 return(0);38 }
