[<<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 }