加载中…
正文 字体大小:

APUE学习笔记-1Files&IO之有趣的文件黑洞

(2012-03-05 19:27:50)
标签:

杂谈

分类: APUE学习

废话很多,作为开头;

首先向Great W.Richard Stevens致敬,APUE,UNP,TCP/IP三本书是我从09(Author去世10年后)开始看的最多三本纸质书,至今未有所成,实在羞愧,不过亡羊补牢,I'll try my best.

实际上APUE代码源自BSD,有些函数用法现在通用的linux细微区别,这也正好给了再次通过比较加深学习机会;

个人理解,实际全书分为几大部分:

1:linux基础,历史起源,运行环境(*inux环境,各个环境POSIX支持);

2:FILE&IO ,也就是各种文件设备,regular files/ directory/ pipe/FIFO/Socket /Symbolic Links, I/O泛指它们直接交互其实就是;

3:Process/Thread/IPC:其实就是fork进程,与pthread_create线程(我知道linux里thread仅仅共享数据进程,只是具体实现方式,逻辑层上确实进程区别的),以及进程通信,IPC InterProcess Communications,保护Pipe, Signal, Mesg Queue, Shared Mem, 扩展不同主机进程之间交互Socket;

4:其它,汗颜,这部分看得最少,主要与Terminal有关的IO数据库,打印机有关东东,等我回头修改;

OK,进入正题,其实文件有关的IO操作还是比较多的,先写点,先声明以下纯属个人理解,如有错误欢迎指正;

书上的这句话实在说的太好,

Many File operations on Unix can be done by five functions: open/read/write/ lseek/close  
这几个函数是System Calls,和以前用的C Libary的 fopen/fscanf /fprintf/fseek/fclose 相对应,后者就是包装了一下前者,用法几乎一样,就是文件的描述符号都是unsigned long的fd,然后需要自己把握一次IO的缓冲;

off_t lseek(int fd, off_t offset, int whence);
  lseek的原型,这个函数挺有意思的,可以用它来制造"Hole file"文件黑洞

下面是示例小程序,新建一个文件“BigHole",然后写入buf1里的内容”The Start Point111111111",接着lseek向后移动offset个Byte,这里设为4096000也就是大约4MB,写入buf2里的内容“The End   Point222222222".

APUE学习笔记-1Files&IO之有趣的文件黑洞

Ok,执行,然后果然生成了大约4.1MB的BigHole,然而ls -s一看,实际上却只占用了8个blocks;

用vim或者od打开一看里面也有内容,虽然是0;如果使用cat BigHole > newFile会发现新生成的newFile占用了4004个blocks,字节数没有出入,很Magic吧
4004 -rw-rw-r-- 1 mike mike 4096054 2012-03-05 20:17 newFile

APUE学习笔记-1Files&IO之有趣的文件黑洞
But Why? Why can a regular file contain hole? How about this hole is huge enough to over the whole available disk free space(such as over 100G, as I just allocate 60G to linux)?

进一步的的测试,将偏移改为1M,然后再设个循环,1024*100,这样大约就是100G的黑洞

off_t offset = 1024000;//about 1M 
for(i=0;i<1024*100;i++){
17 if (lseek(fd, offset, SEEK_CUR))
18 write(fd, buf2, strlen(buf2));
19 }
 测试结果是生成了大约2.1GB的文件,(这是因为linux系统默认只支持2G大小的文件,需要额外加上参数来支持,gcc -g filehole.c -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE,然后先用10G,100G的测试,成功),截个图纪念一下,104.9G ,卡死了我的机器大约2分钟?

413416 -rwxrwSr-T 1 mike mike 104860364827 2012-03-05 21:44 BigHole

然后用head/tail命令打开发现头尾都只有buf1,buf2的内容,然而用od -c打开仍然能看到中间的0;

APUE学习笔记-1Files&IO之有趣的文件黑洞

20分钟,无数发热换来的1TB文件,哈哈,我的硬盘320GB总共,/home26.6GB,纪念一下

APUE学习笔记-1Files&IO之有趣的文件黑洞



从结果来看,机会可以无限制的创建文件,我想如果耐心足够可以创建TB级别的文件;但是如何实现的呢,这个与unix的文件系统有关,说来惭愧,inode那些我又记不清了,解释清楚的话俺也需要先复习。。。。只能再补上了....

---------------------------------------------------------------------------------------------------------

请教了一下Hoplee老师,大意是文件记录的信息里面做了些手脚,会记录大约从A-->B会有多少个0,就是这样;所以在读的时候,就好像真的从硬盘里读了那么多位一样



0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

       

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有