APUE学习笔记(2):lseek()练习与文件洞

时间:2022-05-08 11:11:50

对于lseek函数早在大一的C语言课上就有接触,但是几乎没有使用过,只记得是和文件偏移操作相关的

看了APUE上的示例,又使用od工具查看了内容,果然很神奇,很新鲜

figure3.2.c

[c]
#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)
err_sys("creat error");
if(write(fd, buf1, 10) != 10)
err_sys("buf1 wirte error");
/* offset now = 10 */

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

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

return 0;
}
[/c]

生成执行文件并运行后可以在目录发现一个名为file.hole的文件

[shell]
od -c file.hole
[/shell]

使用如上命令会查看到如下的信息:

[code]
0000000   a   b   c   d   e   f   g   h   i   j  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0040000   A   B   C   D   E   F   G   H   I   J  \n
0040013
[/code]

OK,再用ll看看这个文件洞的信息

APUE学习笔记(2):lseek()练习与文件洞

让我们创建一个相同大小的文件,比较一下这两个文件

使用dd命令创建一个指定大小的文件简直是太方便了。

[shell]
dd if=/dev/zero of=./file.nohole bs=16394 count=1
[/shell]

(如上bs指输入输出的块大小,count指处理的块数)
再来比较一下这两个文件
APUE学习笔记(2):lseek()练习与文件洞

图片前面的“8,20”是这个文件所占用的块数。可以发现文件洞与不存在文件洞是不同的,对啦,以前一直没使用过-s参数,看下ls的man说明:

[code]
-s, --size
print the allocated size of each file, in blocks
[/code]

既然这样,再扩展一点点吧,搜到了查看block块大小的命令,使用tune2fs命令

[shell]
tune2fs -l /dev/sda3
[/shell]

输出了好多,不过有想要的东西

[code]
tune2fs 1.42.8 (20-Jun-2013)
Filesystem volume name:   <none>
Last mounted on:          /boot
Filesystem UUID:          126d717e-27fc-471f-9ebb-0088e5bfeedb
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              128016
Block count:              512000
Reserved block count:     25600
Free blocks:              376340
Free inodes:              127636
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         2032
Inode blocks per group:   254
Flex block group size:    16
Filesystem created:       Mon Mar 31 16:55:44 2014
Last mount time:          Fri Apr 11 21:35:38 2014
Last write time:          Fri Apr 11 21:35:38 2014
Mount count:              12
Maximum mount count:      -1
Last checked:             Mon Mar 31 16:55:44 2014
Check interval:           0 (<none>)
Lifetime writes:          131 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              128
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      77704dbb-7f94-4e98-9dbd-f173eab477fe
Journal backup:           inode blocks
[/code]

说的有点远了~~

记录一下文件洞吧,第一次听说这个东东,在网上查了下,大概是说这个文件洞就是先分配空间,但不使用,比如数据库文件

在网上参看别人的文章,使用命令创建文件洞

链接:http://jianjiaosun.blog.163.com/blog/static/1361244862010111833451413/

不过,还是有些不清楚的东西有待以后考证和研究

1,使用cat命令可以查看文件内容,file.hole中为“abcdefghijABCDEFGHIJ”,file.nohole无内容。恩...这个还算正常。

2,使用vim打开file.hole,会导致文件块数从8便为20,而打开filehole和file.nofile文件会使大小增加一字节,也就是从16394变成16395,稍有不解

APUE学习笔记(2):lseek()练习与文件洞

3,文件的存储这块还很模糊,file.hole为什么占用8个块,file.nofile为什么占用10个块,上面查询到的block大小1024之间又有什么联系,还有待进一步的学习

好,收工,睡觉