APUE学习笔记(2):lseek()练习与文件洞
对于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()练习与文件洞的更多相关文章
- apue学习笔记(第三章 文件I/O)
本章开始讨论UNIX系统,先说明可用的文件I/O函数---打开文件.读写文件等 UNIX系统中的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close open函数 ...
- apue学习笔记(第四章 文件和目录)
本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...
- APUE学习笔记——5.2流与文件对象、fwide
1 流 当一个文件被打开时,可以获得文件描述符.通过文件描述符可以对文件进行I/O操作.而I/O操作是通过流完成的. 流的定向: 在Unix系统中,使用 ASCII标准 ...
- APUE学习笔记3_文件IO
APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...
- APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause
转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- APUE学习笔记2——文件I/O
1 引言 本章首先讨论Unix系统中大多数文件I/O最常用的5个系统函数:open.read.write.lseek以及close. 本章所说明的函数又被成为不带缓冲的I/O,不带缓冲是指每个read ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
- Linux学习笔记14——使用fcntl实现文件锁定
期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...
随机推荐
- 中国的手写输入法iOS8.1在崩溃
当中国的手写输入法.会导致app收起.于debug时刻.报错: 2014-10-22 14:45:10.269 App[524:170755] -[UIKBBlurredKeyView candida ...
- [WebGL入门]四,渲染准备
注意:文章翻译http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家 ...
- 《Java并发编程实战》第二章 线程安全 札记
一个.什么是线程安全 编写线程安全的代码 其核心是管理国事访问的操作. 共享,可变的状态的訪问 - 前者表示多个线程訪问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与其规范 ...
- Sublime Text Package Collections
JavaScriptNext - ES6 Syntax packagecontrol.io github.com Better JavaScript language definition for T ...
- 【二分法】 HDU 2446 Shell Pyramid
意甲冠军:非常多,形成一个金字塔球 文章x层 x*(x+1)/ 2 球 给你个S 金字塔的一层代表第一数字向下S球 它是其中 这层中的第几行 第几列 公式 1 : x*(x+1)*(x+2)/ 6 ...
- 使用HttpURLConnection向服务器发送post和get请求(转)
一.使用HttpURLConnection向服务器发送get请求 1.向服务器发送get请求 @Test publicvoid sendSms() throws Exception{ String m ...
- 使用newLISP由SMTPserver发送电子邮件
直接使用的标准模块smtpx.lsp, smtp.lsp你可以不设置port,庭审后,没用. 以下是一个示例代码: #!/usr/bin/newlisp (set 'debug-flag true) ...
- 如何获得android手机通讯录的字母显示(两)
随后的写如何使各第一字母显示相同的分类触点: 于adapter implement SectionIndexer 这项adapter必须在下面可以实现3接口: @Override public Obj ...
- java数据结构系列之——数组(1)
import javax.management.RuntimeErrorException; public class MyArray { private long array[]; private ...
- LeetCode Merge k Sorted Lists 解决报告
https://oj.leetcode.com/problems/merge-k-sorted-lists/ 归并K已经整理阵列,和分析算法的复杂. 解决报告:无论是不考虑优化,最简单的实现是要重新走 ...