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 ...
随机推荐
- 使用block实现两个页面之间的传统价值观
第二个view声明一个block属性: @property (nonatomic, copy) void(^doTransferMsg)(NSString *_msg); 然后传值方法里检查block ...
- [数字dp] hdu 3565 Bi-peak Number
意甲冠军: 为了范围[X,Y],的最大位数的范围内的需求高峰和值多少. 双峰是为了满足一些规定数量 你可以切两 /\ /\ 形式. 思维: dp[site][cur][ok] site地点 面的数 ...
- 新版本NDK环境结构(避Cygwin,超快)
曾经做Android的项目要用到NDK就必需要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量... 麻烦到不想说 ...
- Https 客户端与服务器交互过程梳理(转)
本文试图以通俗易通的方式介绍Https的工作原理,不纠结具体的术语,不考证严格的流程.我相信弄懂了原理之后,到了具体操作和实现的时候,方向就不会错,然后条条大路通罗马.阅读文本需要提前大致了解对称加密 ...
- 通过HttpClient来调用Web Api接口,实体参数的传递
下面定义一个复杂类型对象 public class User_Info { public int Id { get; set; } public string Name { get; set; } p ...
- SEO要领:8文章主持技巧(两)
续篇:搜索引擎优化要领:8条辅助技巧(一) 四.检查你的robots.txt文件 与谷歌的蜘蛛通信的经常用法是使用robots.txt文件. 这是一个文本文件.同意你告诉搜索引擎,你的站点的网页上抓取 ...
- JS的parent对象
top: 该变更永远指分割窗口最高层次的浏览器窗口.如果计划从分割窗口的最高层次开始执行命令,就可以用top变量. parent: 该变量指的是包含当前分割窗口的父窗口.如果在一个窗口内有分割窗口,而 ...
- 使用Blend的一些问题
原文:使用Blend的一些问题 WPF开发,界面处理首选Blend,如果你开发了两年WPF都没接触过blend(当然这种几率不高),或者你刚接触WPF,可以考虑使用Blend,这货也算得上一个神器,上 ...
- python test0729.py
#!/usr/env python #-*- coding: utf-8 -*- import urllib import urllib2 import random import requests ...
- Appium键盘操作
方法1 AppiumDriver实现了在上述功能,代码如下(java版本) driver.sendKeyEvent(66);方法2 HashMap<String, Integer> key ...