2016-09-14 2 views
0

Я пытался создать файл с отверстием, используя код учебника, и немного изменил его. Однако, должно быть, что-то пошло не так, поскольку я не вижу разницы между обоими файлами с точки зрения размера и блоков диска.Создание файла с отверстием

код, чтобы создать файл с отверстием (Advanced Программирование в Unix среде)

#include "apue.h" 
#include <fcntl.h> 

char buf1[] = "abcdefghij"; 
char buf2[] = "ABCDEFGHIJ"; 

int 
main(void) 
{ 
    int  fd; 

    if ((fd = creat("file.hole", FILE_MODE)) < 0) 
     printf("creat error"); 

    if (write(fd, buf1, 10) != 10) 
     printf("buf1 write error"); 
    /* offset now = 10 */ 

    if (lseek(fd, 16384, SEEK_SET) == -1) 
     printf("lseek error"); 
    /* offset now = 16384 */ 

    if (write(fd, buf2, 10) != 10) 
     printf("buf2 write error"); 
    /* offset now = 16394 */ 

    exit(0); 
} 

Мой код, создание файла в основном полный ABCDEFGHIJ годов.

#include "apue.h" 
#include <fcntl.h> 
#include<unistd.h> 

char buf1[] = "abcdefghij"; 
char buf2[] = "ABCDEFGHIJ"; 

int 
main(void) 
{ 
    int  fd; 

    if ((fd = creat("file.nohole", FILE_MODE)) < 0) 
     printf("creat error"); 

    while(lseek(fd,0,SEEK_CUR)<16394) 
    { 
     if (write(fd, buf1, 10) != 10) 
     printf("buf1 write error"); 
    } 

    exit(0); 
} 

Печать обоих файлов Я получаю ожидаемый результат. Однако их размер идентичен.

{linux1:~/dir} ls -ls *hole 
17 -rw-------+ 1 user se 16394 Sep 14 11:42 file.hole 
17 -rw-------+ 1 user se 16400 Sep 14 11:33 file.nohole 
+4

Возможно, 16384 слишком мало, попробуйте что-то вроде 1048576. – redneb

+0

Это сработало. Очень наивно, чтобы использовать учебник, предоставленные значения, которые были актуальны, вероятно, 10 лет назад ... Спасибо. Если кому интересно: '259 -rw ------- + 1 пользователь se 1048586 14 сен 11:56 file.hole 1155 -rw ------- + 1 пользователь se 1048580 14 сен 11: 56 file.nohole' – DR29

ответ

1

Вы неправильно понимаете, что имеется в виду под «дыркой».

Это означает, что вы пишете некоторое количество байтов, пропустите некоторое количество байтов, а затем напишите больше байтов. Байты, которые вы явно не записываете между ними, установлены в 0.

В самом файле нет отверстия в нем, то есть два отдельных раздела. Он просто имеет байты с 0 в них.

Если вы хотите посмотреть содержимое первого файла, вы увидите, что он имеет «abcdefghij», за которым следуют 16373 (16384 - 10 - 1) байты, содержащие значение 0 (а не символ «0»). ABCDEFGHIJ.

+0

Не совсем. Вы правы, что байты между ними установлены в 0, и я использовал команду od для проверки этого. Тем не менее, существует также преимущество меньшего количества используемых блоков. В исправленной программе * файл отверстия использовал 259 блоков, в то время как .nohole использовал 1155 блоков. – DR29

+0

@ DR29, то это умная файловая система, которая каким-то образом отслеживает блоки с нулем, «вставляя» их при чтении (или сжимает файл). –

+0

@PaulOgilvie: могут быть умные файловые системы, но стандартные файловые системы unix не настолько умны. Они просто не записывают блоки на диск, если программа на самом деле их не пишет. Если вы напишете блок из 0s, он будет записан на диск; если вы переместите указатель записи и затем напишите, тогда не будет никакого дискового представления блоков, которые вы пропустили. При чтении, если блок не на диске, предполагается, что все 0s. Как простой и немой. – rici