[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Освобождение пространства на носителе - Пример

Функция, урезающая файл, приведенная на следующей странице, напоминает
библиотечную функцию truncate(3), описанную позже в этом курсе.
Программа работает следующим образом:
8-15 Для отладки функции урезания, компилируйте программу следующим
образом:
          $ cc -DDEBUG truncate.c

          При этом строки между #if и #endif останутся в программе.

17   Функция урезания получает два аргумента. Файл, на имя которого
указывает 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 x
   5   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);
 7
 8 #if DEBUG
 9 main(int argc, char *argv[])
10 {
11     off_t len;
12     len = atol(argv[2]);
13     trunc(argv[1], len);
14 }
15 #endif
16
17 int trunc(char *path, off_t len)
18 {
19     struct flock lck;
20     register fd;
21
22     if((fd = open(path, O_WRONLY)) == -1){
23     perror(path);
24     return(-1);
25     }
26
27     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 */
30
31     if(fcntl(fd, F_FREESP, &lck) == -1){
32     perror("fcntl");
33     close(fd);
34     return(-1);
35     }
36     close(fd);
37     return(0);
38 }