Unix系统编程()lseek系统调用
之前知道lseek这个系统调用可以改变文件的偏移量,或者叫偏移量或指针。
文件偏移量是指执行下一个read或者write操作的文件起始位置,会以相对于文件头部起始点的文件当前位置来表示。
除非指定了O_APPEND选项。
文件第一个字节的偏移量为0。
文件打开时,会将文件偏移量设置为指向文件的开始,以后每次read或write调用将自动对其进行调整,以指向已读或已写数据后的下一字节。因此连续的read和write调用将按顺序递进,对文件进行操作。
lseek会根据offset和whence参数值来调整文件的偏移量。
off_t lseek(int fd, off_t offset, int whence)
offset 指定了一个以字节为单位的数值
whence 表明应参照哪个基点来解释offset参数,应为下列其中之一:
SEEK_SET 将文件偏移量设置为文件头部起始点开始的offset字节
SEEK_CUR 相对于当前文件偏移量,将文件偏移量调整offset个字节
SEEK_END 将文件偏移量设置为起始于文件尾部的offset个字节,也就是offset应该从文件最后一个字节之后的下一个字节算起。

早期的UNIX实现中,whence参数用整数0,1,2来表示的。
如果whence参数值为SEEK_CUR或者SEEK_END,那么offset参数可以为正数也可以为负数;如果whence参数值为SEEK_SET,offset参数值必须为非负数。
lseek调用成功会返回新的文件偏移量,下面调用只是获取文件偏移量的当前位置,并没有修改它。
curr = lseek(fd, 0, SEEK_CUR);
lseek(fd, 0, SEEK_SET); start of file
lseek(fd, 0, SEEK_END); Next byte after the end of the file
lseek(fd, –1, SEEK_END); Last byte of file
lseek(fd, –10, SEEK_CUR); Ten bytes prior to current location
lseek(fd, 10000, SEEK_END); 10001 bytes past last byte of file
lseek调用只是调整内核中与文件描述符相关的文件偏移量记录,并没有引起对任何物理设备的访问。
文件偏移量,文件描述符和已打开文件的关系还需要进一步厘清。
lseek并不适用于所有类型的文件,不允许将lseek应用于管道、FIFO、socket或者终端。
一旦如此,调用将会失败,并将errno置为ESPIPE。
另一方面,只要合情合理,也可以将lseek应用于设备,例如磁盘或者磁带上的某一具体位置。
lseek的l来源于long。
lseek和文件空洞。
文件偏移量可以大于文件的当前长度的,在这种情况下,该文件的下一次写将加长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被读为0。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h> #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ"; int main(int argc, char * argv[]) { int fd;
if( (fd = creat("file.hole", FILE_MODE)) < )
fprintf(stderr, "creat error\n"); if( write(fd, buf1, ) != )
fprintf(stderr, "buf1 write error\n"); if( lseek(fd, , SEEK_SET) == -)
fprintf(stderr, "lseek error\n"); if( write(fd, buf2, ) != )
fprintf(stderr, "buf2 write error\n"); exit();
}
文件中的空洞并不要求在磁盘上占用存储区。
Unix系统编程()lseek系统调用的更多相关文章
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...
- 《Linux/Unix系统编程手册》读书笔记1
<Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...
- 《Linux/Unix系统编程手册》读书笔记2
<Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...
- 《Linux/Unix系统编程手册》读书笔记9(文件属性)
<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...
- 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)
<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...
- 《Linux/Unix系统编程手册》读书笔记4
<Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...
- 《Linux/Unix系统编程手册》 时间子系统
Linux下操作系统编程有两本经典APUE即<Advanced Programming in the UNIX Environment>和TLPI<The Linux Program ...
- 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll
关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...
- 学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥 ...
- 《Linux/UNIX系统编程手册》第56章 SOCKET:介绍
关键词: 1. socket基础 一个典型的客户端/服务器场景中,应用程序使用socket进行通信的方式如下: 各个应用程序创建一个socket.socket是一个允许通信的设备,两个应用程序都需要用 ...
随机推荐
- Verilog语法
语法子集很小,易用. 模块:module…endmodule 端口:input,output,inout(双向特殊) inout比较难用,有一张真值表,需要大家观察后书写,基本原则就是输入时一定是高阻 ...
- scrapy 抓取数据被禁止的解决方法
在用抓取头条新闻的数据时出现以下问题:禁止抓取,结果数据没有出来 后来经过查询得知需要把settings.py里面 修改为ROBOTSTXT_OBEY = False就可以了, 默认True
- Java Web----EL(表达式语言)详解
Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...
- Docker Swarm 让你事半功倍
2016 年 DockerCon (天啊……我多么希望我当时在场)上展示的最重大的变革之一就是 1.12 版本引擎的 Swarm 模式.它意味着什么呢?它意味着:如果你在运行 Docker 1.12时 ...
- mysql有关问题之:the security settings could not be applied to
mysql问题之:the security settings could not be applied to 转自:http://www.myexception.cn/mysql/503556.htm ...
- Windows Vista如何让梦幻桌面支持更多格式
Windows Vista 梦幻桌面(DreamScene)到底能不能支持除了Mpeg/mpg以外的格式? 很多人说梦幻桌面的视频格式有限,像AVI.RM.RMVB就不能做成梦幻桌面!也有很多朋友着急 ...
- 使用Loadrunner进行文件的上传和下载
最近使用loadrunner中需要录制文件的上传和下载,上传功能模块利用录制可以直接实现,下载无法实现,在网上找到了一段代码,自己动手试验了下,发现没有用 辛苦找到的,还是记录下吧 (1)LoadRu ...
- Vue实例初始化的选项配置对象详解
Vue实例初始化的选项配置对象详解 1. Vue实例的的data对象 介绍 Vue的实例的数据对象data 我们已经用了很多了,数据绑定离不开data里面的数据.也是Vue的核心属性. 它是Vue绑定 ...
- Struts2中文件下载
在struts.xml中配置如下 <action name="download" class="cn.itcast.domain.User" method ...
- Nginx视频流模块nginx-rtmp-module
文章参考地址:https://www.cnblogs.com/tinywan/p/6202345.html nginx-rtmp-module:https://github.com/arut/ngin ...