Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5580533
  • 博文数量: 922
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11226
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(922)

文章存档

2023年(1)

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类: LINUX

2011-12-27 10:02:42

++++++APUE读书笔记-03文件输入输出(2)++++++

 

4、close函数
================================================
 close函数关闭一个打开文件。声明如下:
 #include
 int close(int filedes);
 返回:如果成功返回0,如果错误返回1。
 进程结束的时候内核会自动关闭它打开的所有文件;关闭文件的时候,会自动释放当前进程持有的所有在那个被关闭文件上面的锁。很多程序都使用这一功能而不显式地用close关闭打开的文件。

参考:


5、lseek函数
================================================
 每个被打开的文件都有一个与其相关联的“当前文件偏移量” 。其值为从文件开始到当前位置的字节数。通常,读、写操作都从当前文件偏移量开始,并每次读写之后,会相应地对移量进行增加。系统默认,打开一个文件时,偏移量为0(除非指定O_APPEND选项)。
 我们可以通过函数lseek来设置文件偏移量,这个函数声明如下:
 #include
 off_t lseek(int filedes, off_t offset, int whence);
 返回:如果成功返回新的文件偏移,如果错误返回1。
 对参数offset的含义根据参数whence的值有不同的解释:
 a)若whence是SEEK_SET,则offset是相对文件开始计算的偏移字节数。
 b)若whence是SEEK_CUR,则offset是相对文件当前偏移值计算的偏移字节数(可正可负)。
 c)若whence是SEEK_END,则offset是相对文件末尾开始计算的偏移字节数(可正可负)。
 若lseek成功执行,则返回新的文件偏移量。如下方法可以确定一个打开文件的当前偏移量:
 off_t    currpos;
 currpos = lseek(fd, 0, SEEK_CUR);
 这种方法也可用来确定所涉及的文件是否可以设置位移量。如果文件描述符引用的是一个管道或FIFO,则lseek返回-1,并将errno设置为EPIPE。
 pipe, FIFO, socket等这样不能lseek的文件当被lseek的时候,会返回1并且置errno为ESPIPE.lseek返回值对于设备文件等特殊的文件可能为负数,对于正规文件非负,所以检测时候要小心。检测方法大致如下:
 if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1)
  printf("cannot seek\n");
 else
  printf("seek OK\n");
 另外,原文在第4章12节中提到,当lseek的位置大于文件的大小,然后在写入数据,会扩展文件大小,并且在原来的结尾和lseek处创建文件“空洞”。文件空洞并不会消耗磁盘空间,查看文件空洞可以用od。具体还是参见上面的网址。后面会继续说道文件“空洞”。大致是ls -l的size和du的size不是一样的,似乎前者包含了hole的,而du是不包含空洞的。cat就会把hole用空字符打印出来,所以一个包含了hole的文件core,用:
 #cat core>core.copy
 之后,再:
 #du -s core.copy
 根据显示的大小会发现比原来的大小(用“du -s core”看)大了。

参考:


6、read函数
================================================
 read函数用来从打开的文件当中读取数据。声明如下:
 #include
 ssize_t read(int filedes, void *buf, size_t nbytes);
 返回:如果成功则返回读取的字节数目,如果遇到文件结尾则返回0,如果错误返回1。
 read读取,是从当前的文件偏移开始读取的。(对于返回1的时候如何确定是正确读取还是错误,经过网上搜索发现,一般错误的时候,read返回-1,具体情况前面讲述open函数的时候说明了对于返回值是如何处理的)

参考:


7、write函数
================================================
 write函数用来想打开的文件写入数据。声明如下:
 #include
 ssize_t write(int filedes, const void *buf, size_t nbytes);
 返回:如果成功返回写入字节数目,如果错误返回1。(对于返回1如何确定是正确写入还是错误,经过网上搜索发现,一般错误的时候,write返回-1,具体情况前面讲述open函数的时候说明了对于返回值是如何处理的)
 write写入,是从当前的文件偏移开始写入的。

参考:

 

 

阅读(817) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~