Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343715
  • 博文数量: 60
  • 博客积分: 1570
  • 博客等级: 上尉
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-02 23:37
文章分类

全部博文(60)

文章存档

2012年(2)

2010年(2)

2009年(56)

分类: LINUX

2009-11-10 23:38:10

一、函数原型:
 

#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);

返回值:成功返回新的文件偏移量,如出错则返回-1

lseek 显式地为一个打开的文件设置其偏移量。
对参数offset的解释与参数whence的值有关。

1.若whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节。

2.若whence是SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可为正或负。

3.若whence是SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可为正或负。

二、

若lseek成功执行,则返回新的文件偏移量,为此可以用下列方式确定打开文件的当前偏移量:

offset currpos;

currpos = lseek(fd, 0, SEEK_CUR);

这种方法也可以用来确定所涉及的文件是否可以设置偏移量。如果文件描述符引用的是一个管道、FIFO或网络套接字,则lseek返回-1,并将errno设置为ESPIPE。

通常,文件的当前偏移量应当是一个非负整数,但是,某些设备也可能允许负的偏移量。但是对于普通文件,其偏移量必须是非负值。因为偏移量可能是负值,所以在比较lseek的返回值时应当谨慎,不要测试它是否小于0, 而要测试它是否等于 -1。

三、文件空洞

   文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但是没有写过的字节都被读为0。
  文件中的空洞并不要求在磁盘上占用存储区。具体处理方式与文件系统的实现有关。当定位到超出文件尾端以后写时,对于新写的数据需要分配磁盘块,但是对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块。
 
另:查看文件的实际内容,可以使用命令 od 。例如
od -c filename  // -c 标志表示以字符方式打印文件内容。
 
四、注意
APUE2中的说明:
如果用 O_APPEND 标志打开了一个文件, 则相应标志也被设置到文件表项的文件状态标志中。每次对这种具有添写标志的文件执行写操作时, 在文件表项中的当前文件偏移量首先被设置为i节点表项中的文件长度。这就使得每次写的数据都添加到文件的当前尾端处。 
 
测试结果:
以 O_APPEND方式打开文件时, 如果后面调用 lseek 修改当前文件偏移量,然后 在调用write函数的话,新写入的内容,仍旧写到文件末尾。就是说,这种情况下,lseek修改了当前文件偏移量后,write时,当前文件偏移量,会被重新设置为i节点表项中的文件长度。
 
注意:如果用 O_APPEND 标志打开了一个文件,这个时候,当前文件偏移量为 0.
  
 
阅读(1401) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~