1.read函数

调用read函数从文件去读数据,函数定义如下:
#include <unistd.h>
ssize_t read(int filedes, void* buff, size_t nbytes);

成功则返回实际读取的byte数,如果已经达到文件结尾则返回0,出错则返回-1.

2.write函数

调用write函数向打开的文件写入数据,函数定义如下:
#include <unistd.h>
ssize_t write(int filedes, void* buff, size_t nbytes);

成功则返回实际写入的byte数,出错则返回-1.

3.lseek函数

每个打开的文件都有一个关联的“当前偏移量”,用于记录从文件到当前当前位置的偏移字节数,lseek函数是设置这个当前偏移量

的函数,函数的声明如下:
#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);

成功则返回新的文件偏移量,失败则返回-1.

如果whence是SEEK_SET,则文件的偏移量设置为文件开始加上offset个字节。
如果whence是SEEK_CUR,则文件的偏移量设置为当前偏移量开始加上offset个字节,offset可正可负。
如果whence是SEEK_END,则文件的偏移量设置为文件长度加上offset个字节,offset可正可负。
不是每个文件都能够设置偏移量,有些文件如管道,FIFO或socket,无法设置偏移量,可以使用如下函数测试是否可以设置偏移量,
如果返回-1,则表示不可以。
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);

2.实践

创建一个文件,往文件中写入10个字符,然后再使用lseek定位文件开始加上4个字节的偏移量,然后读取接下来的内容。
#include <fcntl.h>
#include <stdio.h>int main(void){int fd,byteNum,result;char wbuf[10] = "123456789";char rbuf[10];if((fd = open("./a.txt", O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IXUSR))<0){perror("open");return -1;}if((byteNum = write(fd, wbuf, 10))<0){perror("write");return -1;}if((result = lseek(fd, 4, SEEK_SET))<0){perror("lseek");return -1;}if((byteNum = read(fd, rbuf, 10)) < 0){perror("read");return -1;}printf("read content:%s\n",rbuf);close(fd);return 0;
}

运行结果:

read content:56789
如果将偏移量设置为文件开始加上一个负数,调用lseek就会出错。
#include <fcntl.h>
#include <stdio.h>int main(void){int fd,byteNum,result;char wbuf[10] = "123456789";char rbuf[10];if((fd = open("./a.txt", O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IXUSR))<0){perror("open");return -1;}if((byteNum = write(fd, wbuf, 10))<0){perror("write");return -1;}if((result = lseek(fd, -1, SEEK_SET))<0){perror("lseek");return -1;}if((byteNum = read(fd, rbuf, 10)) < 0){perror("read");return -1;}printf("read content:%s\n",rbuf);close(fd);return 0;
}

运行结果:

lseek: Invalid argument
是不是offset就一定不能为负数呢,不一定,只要最终的偏移量不小于0就可以了,看下面的例子。
#include <fcntl.h>
#include <stdio.h>int main(void){int fd,byteNum,result;char wbuf[10] = "123456789";char rbuf[10];if((fd = open("./a.txt", O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IXUSR))<0){perror("open");return -1;}if((byteNum = write(fd, wbuf, 10))<0){perror("write");return -1;}if((result = lseek(fd, -4, SEEK_CUR))<0){perror("lseek");return -1;}if((byteNum = read(fd, rbuf, 10)) < 0){perror("read");return -1;}printf("read content:%s\n",rbuf);close(fd);return 0;
}

运行结果:

read content:789
如果文件偏移量大于文件长度再写入数据,那么生成的文件就会出现空洞。先往文件写入10个字符,再跳过20个字符,再写入10个字符。
#include <fcntl.h>
#include <stdio.h>int main(void){int fd,byteNum,result;char wbuf[10] = "123456789";char rbuf[10];if((fd = open("./a.txt", O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR))<0){perror("open");return -1;}if((byteNum = write(fd, wbuf, 10))<0){perror("write");return -1;}if((result = lseek(fd, 40960, SEEK_END))<0){perror("lseek");return -1;}if((byteNum = write(fd, wbuf, 10)) < 0){perror("write");return -1;}close(fd);return 0;
}

运行结果:

-rw------- 1 root root 40980 2013-09-09 15:03 a.txt
使用od命令查看文件内容:
root@virtual-machine:~# od -c a.txt

0000000   1   2   3   4   5   6   7   8   9  \0  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0120000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0   1   2   3   4   5   6
0120020   7   8   9  \0
0120024

空洞的内容全部置为0
查看下文件占用的磁盘大小:
8 -rw------- 1 root root 40980 2013-09-09 15:41 a.txt
文件虽然有40980个字节,只占用了8个block,即8K(这边的block不是文件系统的block,而是kernel block,linux中,
kernel block大小为1K),如果是没有空洞的文件,则占用磁盘大小应该是44K。可见,虽然有空洞,但是实际存储时没
有占用文件大小的磁盘空间。

《UNIX环境高级编程》笔记--read函数,write函数,lseek函数相关推荐

  1. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

  2. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...

  3. UNIX环境高级编程笔记

    1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len);   SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务:   ...

  4. UNIX环境高级编程笔记(2)- STDIN_FILENO、STDOUT_FILENO和stdin、stdout的区别

    目录 前言 一.STDIN_FILENO.STDOUT_FILENO介绍 二.stdin.stdout介绍 三.代码例程 1.文件描述符的使用 2.流的使用 3.代码标记 总结 前言 本章主要通过UN ...

  5. UNIX环境高级编程笔记(14)- 函数sigsuspend 实现父进程子进程同步

    前言 本章主要介绍sigsuspend函数以及实现父进程子进程通过信号的同步. 一.函数sigsuspend #include<signal.h> int sigsuspend(const ...

  6. 函数sleep、nanosleep和clock_nanosleep(UNIX环境高级编程笔记)

    #include <unistd.h> unsigned int sleep(unsigned int seconds);               返回值:0或未休眠完的秒数   此函 ...

  7. UNIX环境高级编程笔记之进程控制

    本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...

  8. Unix环境高级编程笔记:12、高级IO

    2019独角兽企业重金招聘Python工程师标准>>> 1.非阻塞IO 系统调用分成"低速"系统调用和其他系统调用.低速系统调用是可能会使进程永远阻塞的一类系统调 ...

  9. 文件io(二)--unix环境高级编程笔记

    在linux中,打开的文件组织结构如下: 与打开的文件相关的有三个数据结构,就是上图中的三部分. 在linux中,有一个进程表,每一个进程在进程表中有一个表项.每一个进程表项中都维护着一张打开文件的描 ...

  10. 《Unix环境高级编程》学习笔记:从点到面

    以前在课堂上学习过<Unix初级教程(第四版)>,对于Unix有了一点了解.由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本<Unix环境高级编程>便 ...

最新文章

  1. PHP遍历用blade标签表示,php-Laravel Blade {{$variable或’Default Text’}}无法使用网址
  2. Gut:华中科大蔺蓉组开发简单便捷无创肠道生物信息获取方法
  3. android开发小技巧:实现listview异步加载图片
  4. python列表切片口诀-Python-100例(7-8) 复制列表 打印乘法口诀
  5. VM与VPC共存(续)
  6. Java技术:项目构建工具Maven最佳替代者gradle介绍
  7. 【渝粤教育】电大中专电大中专沟通技巧考试考核试题 (2)作业 题库
  8. ROS安装过程和配置过程(可能出现的问题及解决方法)
  9. 宜家邮件系统正遭网络攻击
  10. 更新新网卡驱动,修复win7雷凌网卡Ralink RT3290在电脑睡眠时和启动网卡时出现蓝屏netr28x.sys驱动文件错误...
  11. HG8240电信光猫禁用TR069之修改配置法
  12. 2013年最具有技术影响力原创图书评选
  13. CorelDRAW2023安装下载教程精简版矢量绘图软件
  14. 读周爱民《javascript语言精髓与编程实践》有感
  15. 鸿蒙os适配平板,华为新平板搭载高通4G芯片,鸿蒙OS已适配完成,友商随时可用...
  16. STM32中断优先级分组概念
  17. python 百度地图api
  18. 程序员的日常:当一名程序员到底有多难?
  19. 计算机组成原理-算术逻辑单元(ALU)
  20. idea 在创建maven 时出现报错org.codehaus.plexus.component.repository.exception.ComponentLookupException:

热门文章

  1. 肖申克的救赎,阅后瞎想...(zz)写的不错
  2. 实验三 类和对象
  3. SpringBoot系列六:SpringBoot整合Tomcat
  4. 图片上传至服务器实现压缩
  5. 定时任务执行利器Timer和ScheduledThreadPoolExecutor使用
  6. Jsp语法、指令及动作元素
  7. php-5.6配置,PHP5.6+apache2.4环境配置
  8. java 类复制构造方法_java面向对象入门(3)-java构造方法
  9. Android编程之DialogFragment源码详解(二)
  10. Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音