2016-09-14 2 views
0

私は、教科書コードを使って穴が開いたファイルを作成し、少し修正しました。しかし、サイズとディスクブロックの点で両ファイルの間に違いは見られないので、何かが間違っていたはずです。穴を持つファイルを作成する

コードABCDEFGHIJ年代の基本的完全なファイルを作成し、私のコード穴(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); 
} 

でファイルを作成します。

#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 user se 1048586 Sep 14 11:56 file.hole 1155 -rw ------- + 1 user se 1048580 Sep 14: 56 file.nohole' – DR29

答えて

1

「穴」の意味を誤解しています。

つまり、いくつかのバイト数をスキップし、いくつかの他のバイト数をスキップして、さらに多くのバイトを書き込むということです。間に明示的に書き込まないバイト数は0に設定されます。

ファイル自体には穴がありません。つまり、2つの別々のセクションです。その中には0のバイトしかありません。

最初のファイルの内容を見ると、 "abcdefghij"の後に値0(文字 "0"ではなく)が続く16373バイト(16384 - 10 - 1)が続きますABCDEFGHIJによる。

+0

あまりありません。あなたは間にあるバイトが0に設定されていることは間違いありません。しかしながら、使用されるブロックの数がより少ないという利点もある。修正プログラムでは、* holeファイルは259ブロックを使用し、.noholeは1155ブロックを使用しました。 – DR29

+0

@ DR29の場合、それは何とかゼロを持つブロックを何とか追跡し、読み込み時にそれらを「挿入する」(またはファイルを圧縮する)巧妙なファイルシステムです。 –

+0

@PaulOgilvie:そのような巧妙なファイルシステムがあるかもしれませんが、標準のunixファイルシステムはそれほど巧妙ではありません。プログラムが実際にそれらを書き込まない限り、単にブロックをディスクに書き込まない。 0のブロックを書くと、ディスクに書き込まれます。書き込みポインタを進めてから書き込むと、スキップしたブロックのディスク表現はありません。読み込み時に、ブロックがディスク上にない場合は、すべて0とみなされます。それと同じくらい単純で愚かです。 – rici

関連する問題