函数 lseek 的用处
介绍
lseek 可以显式地为一个文件设置偏移量,设置成功返回新的偏移量,设置失败返回 -1
每个文件都有一个与其相关的“当前文件偏移量”,一般是个非负整数,用来度量从文件开始出计算的字节数。通常对文件的读写操作都是从“当前文件偏移量”处开始
文件偏移量允许大于当前文件长度,这样一来文件中会包含一个“空洞”。这部分“空洞”不占用磁盘块。在读的时候被读为 0
用途:迅雷下载
之前看到过迅雷下载的文件,只要任务创建好,文件的大小就是将来下载完的文件大小(只是看起来比较大,并没有实际占用那么多磁盘空间)。当时有点奇怪,但是没有深究,看到 lseek 的时候去搜了一下,原来是这样的原理!
先利用空洞文件的特性,建立一个跟目标文件大相同的文件,之后下载可以采用多线程的方式同时写入,加快下载速度。
有的人问为什么没有采用写多个小文件最后合并的策略。两方面原因:
- 合并文件比较费时间,很多小的碎片,硬盘也很累
- 提前占用空间的好处是,如果下载空间不足,可以在任务创建时就提醒用户,而不是等下载到一半才发现空间不够用