对于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看看这个文件洞的信息

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

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

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

(如上bs指输入输出的块大小,count指处理的块数)
再来比较一下这两个文件

图片前面的“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,稍有不解

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

好,收工,睡觉

APUE学习笔记(2):lseek()练习与文件洞的更多相关文章

  1. apue学习笔记(第三章 文件I/O)

    本章开始讨论UNIX系统,先说明可用的文件I/O函数---打开文件.读写文件等 UNIX系统中的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close open函数 ...

  2. apue学习笔记(第四章 文件和目录)

    本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...

  3. APUE学习笔记——5.2流与文件对象、fwide

    1 流         当一个文件被打开时,可以获得文件描述符.通过文件描述符可以对文件进行I/O操作.而I/O操作是通过流完成的. 流的定向:         在Unix系统中,使用 ASCII标准 ...

  4. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  5. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  6. Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  7. APUE学习笔记2——文件I/O

    1 引言 本章首先讨论Unix系统中大多数文件I/O最常用的5个系统函数:open.read.write.lseek以及close. 本章所说明的函数又被成为不带缓冲的I/O,不带缓冲是指每个read ...

  8. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

  9. Linux学习笔记14——使用fcntl实现文件锁定

    期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...

随机推荐

  1. machine learn in python 第二章2.1.1

    1大约 sklearn.datasets from sklearn.datasets import load_iris import numpy as np data = load_iris() da ...

  2. Sizzle.filter [ 源代码分析 ]

    最近的研究已Sizzle选择,对于原理中我们也不得不佩服! Sizzle中间filter办法.主要负责元素表达式过滤块的集合,在内部的方法调用Sizzle.selector.fitler滤波操作的操作 ...

  3. Visual Studio Team Services使用教程--Readers tfs组成员添加

  4. SQL开发中容易忽视的一些小地方(四)

    原文:SQL开发中容易忽视的一些小地方(四) 本篇我想针对网上一些对于非聚集索引使用场合的某些说法进行一些更正. 下面引用下MSDN对于非聚集索引结构的描述. 非聚集索引结构: 1:非聚集索引与聚集索 ...

  5. bzoj 2437 [Noi2011]兔子和鸡蛋 [二分图匹配]

    叙述性说明 这些日子.兔子和蛋像一个新的棋盘游戏. 这场比赛是在 n 行 m 在船上进行列. 前,棋盘上有一 个格子是空的,其他的格子中都放置了一枚棋子,棋子或者是黑色,或者是白色. 每一局游戏总是兔 ...

  6. MPQ Storm库 源代码分析 一个

    MPQ什么? MPQ维基上说的非常明确. 简而言之,它是暴雪公司用于游戏数据打包的工具.星际争霸,魔兽争霸游戏中都有使用.该工具内含游戏资源加密和压缩等功能.         git下载地址:http ...

  7. ARP协议的基础知识

          关于ARP协议的基础知识 1.ARP的工作原理 本来我不想在此重复那些遍地都是的关于ARP的基本常识,但是为了保持文章的完整性以及照顾初学者,我就再啰嗦一些文字吧,资深读者可以直接跳过此节 ...

  8. Linux内核分析(五)----字符设备驱动实现

    原文:Linux内核分析(五)----字符设备驱动实现 Linux内核分析(五) 昨天我们对linux内核的子系统进行简单的认识,今天我们正式进入驱动的开发,我们今后的学习为了避免大家没有硬件的缺陷, ...

  9. [android更新类的内容开发APP]四、项目布局的基本功能(继续)

    昨天,只拿到电脑,别说,眼泪 http://joveth.github.io/funny/ 1.选项卡的滑动效果 要知道.用这个选项卡就是想让它滑动起来,不然的话.我才不喜欢用它呢. 在让他滑动之前, ...

  10. Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

    转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html? ca=drs-cn-0125 ...