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是一个允许通信的设备,两个应用程序都需要用 ...
随机推荐
- python学习:基础概念
Python 包管理工具解惑 python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到相当疑惑(嗯,是困惑).主要表现在下面几个方面: 这几个包管理工具有什么不同? ...
- RawCap抓取本地回环接口数据包
RawCap.exe --help ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 D: ...
- 流畅的python第四章文本和字节序列学习记录
字符问题 把码位转化成字节序列的过程是编码,把字节序列转化成码位的过程是解码 把unicode字符串当成人类可读的文本,码位当成机器可读的, 将字节序列编程人类可读是解码,把字符串编码成字节序列是编码 ...
- NDK下vfork+execl启动程序
pid_t _pid = vfork(); if (_pid == 0) {//child process LOGV("[ContextSharing]in child process.&q ...
- 【转】php中的会话机制(2)
原文:https://segmentfault.com/a/1190000000468220 发现,在调用session_start()的时候, session_start() 里面应该是有调用类似 ...
- 利用Referer请求头阻止"盗链"
转自:http://wisdomsong2007.blog.163.com/blog/static/47783725200882523820664/ 前言 有一些站点自己没有提供下载空间,但是为了吸引 ...
- ResourceBundle的使用
ResourceBundle用来读取properties配置文件,配置文件的位置只能放到src根目录下,当然这个功能的目的是为了实现国际化. 代码如下: package com.comp.common ...
- eclipse 编译JAVA 项目导入的WEB项目 无法编译问题
右击你的项目 选择properties ---->java Build Path--->Default output folder新建一个classes目录就好了 watermark/2 ...
- Mac下忘记了phpAdmin设置的MySQL密码
事情是这样的,我昨天配置完MySQL和PHP环境后,又配置了phpAdmin. 这本来是件好事,结果我看到phpAdmin提醒我说我的MySQL的Root帐号密码是空密码,于是我修改了下密码. 由于p ...
- C# 中字符串string和字节数组byte[]的转换
string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]转string: stri ...