Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции иртегова / Лекция 2 - Файловый ввод-вывод.doc
Скачиваний:
43
Добавлен:
06.06.2015
Размер:
193.02 Кб
Скачать
      1. Освобождение пространства на диске

Команда 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 равен нулю, место освобождается от указанной точки до конца файла.

Если освобождаемый участок захватывает конец файла, то длина файла уменьшается. Если освобождаемый участок не доходит до конца файла, то образуется «дырка» в файле, то есть файл становится разреженным, но его логическая длина не изменяется.

      1. Освобождение пространства на диске - Пример

Функция, урезающая файл, приведенная на следующей странице, напоминает библиотечную функцию 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 }