文件空洞

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>

char        buf1[] = "abcdefghijklmnopqrstuvwxyz";
char        buf2[] = "1234567890";

int main(void)
{
        int         fd;

         if ((fd = open( "filehole", O_RDWR|O_TRUNC|O_CREAT)) < 0)
                printf( "creat error\n");

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

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

         if (write(fd, buf2, 10) != 10)
                printf( "buf2 write error\n");
        /* offset now = 16394 */
  
        return 0;
}
O_RDWR:可读可写
O_TRUNC:当有写操作时文件截短为0
O_CREAT:当文件不存在时,创建
程序分析:先行写入26个字符,然后文件的偏移量从第一个移到16384处,再从这处写入10个字符
程序执行结果分析:
得到的文件大小:
[root@server myprogram]# ls -l filehole
---s--x---  1 root root 16394 Sep 20 23:23 filehole
可见得到的文件大小和普通操作文件一样
[root@server myprogram]# od -c filehole
0000000   9   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p
0000020   q   r   s   t   u   v   w   x   y   z  \0  \0  \0  \0  \0  \0
0000040  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0040000   1   2   3   4   5   6   7   8   9   0
0040012
可见中间得到了大量的\0数据,
但是这些空洞并不一定要占用同一大小的存储块,
比较创建一个同样大小但无空洞的文件进行比较
[root@server myprogram]# ls -l filehole filenohole
8 ---s--x---  1 root root 16394 Sep 20 23:23 filehole
20 -rw---x---  1 root root 16394 Sep 20 23:23 filehole
有空洞文件占用8个存储块,无空洞文件占用20个存储块
可见里面确实有不占用同样大小存储块的空洞存在,但是这些空洞在我们并不影响文件偏移量,也不影响我们对于文件的使用



本文出自 “nnssll” 博客,谢绝转载!

你可能感兴趣的:(职场,休闲,filehole)