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是一个允许通信的设备,两个应用程序都需要用 ...
随机推荐
- ubuntu下cmake自动化编译的一个例子
一个CMakeLists.txt的例子参考:https://www.hahack.com/codes/cmake/https://blog.csdn.net/afei__/article/detail ...
- curl错误码大全
CURL状态码列表 状态码 状态原因 解释 0 正常访问 访问地址未返回结果 1 错误的协议 未支持的协议.此版cURL 不支持这一协议. 2 初始化代码失败 初始化失败. 3 URL格式不正确 UR ...
- ThreadLocal的简单应用
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式.前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一 ...
- 内网渗透技巧:判断机器真实外网IP的5种方法总结
在内网渗透中有时需要在某台WEB服务器中留下后门,该机器可以通过内网IP建立IPC连接,但还需要获知外网IP或域名才能访问Wbshell,在无网关权限的情况下,我总结了有如下方法: 1.通过nsloo ...
- JMeter 三:搭建一个Web Test Plan
参考:http://jmeter.apache.org/usermanual/build-web-test-plan.html 场景 5个用户并发测试百度搜索,有两个请求,一个请求搜索“你好”,一个请 ...
- Angular 监听路由变化事件
摘要: $stateChangeStart- 当模板开始解析之前触发 $rootScope.$on('$stateChangeStart', function(event, toState, toPa ...
- eclipse 编译JAVA 项目导入的WEB项目 无法编译问题
右击你的项目 选择properties ---->java Build Path--->Default output folder新建一个classes目录就好了 watermark/2 ...
- Unity3D系列教程--使用免费工具在Unity3D中开发2D游戏 第一节
声明: 本博客文章翻译类别的均为个人翻译,版权全部.出处: http://blog.csdn.net/ml3947,个人博客:http://www.wjfxgame.com. 译者说明:这是一个系 ...
- Struct2-使用随笔
提要:最近写了一个2-3各页面的使用Struts2的Demo,在这里做下总结,都已经3年多没做J2EE了,有些感觉都快找不到了. 目录 1.必备开发工具 2.必备jar包 3.了解知识点 4.遇到的问 ...
- 关于华为x1 7.0无法从eclipse发布的更新as发布的apk
目前只在华为x1 7.0手机上发现这个问题,坑大了. MediaPad 10 FHD 华为这款可以安装. HUAWEI G525-U00 华为这款也可以安装. 目前公司就这几款华为手机了. 原因是 在 ...