zoukankan      html  css  js  c++  java
  • 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应该从文件最后一个字节之后的下一个字节算起。

    image

    早期的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。

     1 #include <stdio.h>
     2 #include <sys/types.h>
     3 #include <sys/stat.h>
     4 #include <fcntl.h>
     5 #include <stdlib.h>
     6 
     7 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
     8 char buf1[] = "abcdefghij";
     9 char buf2[] = "ABCDEFGHIJ";
    10 
    11 int main(int argc, char * argv[]) {
    12 
    13   int fd;
    14   if( (fd = creat("file.hole", FILE_MODE)) < 0)
    15     fprintf(stderr, "creat error
    ");
    16 
    17   if( write(fd, buf1, 10) != 10)
    18     fprintf(stderr, "buf1 write error
    ");
    19 
    20   if( lseek(fd, 16384, SEEK_SET) == -1)
    21     fprintf(stderr, "lseek error
    ");
    22 
    23   if( write(fd, buf2, 10) != 10)
    24     fprintf(stderr, "buf2 write error
    ");
    25 
    26   exit(0);
    27 }

    文件中的空洞并不要求在磁盘上占用存储区。

  • 相关阅读:
    前端验证银行卡(Luhn校验算法)
    常见的三狼布局
    项目中的分页插件
    JavaScript葵花宝典之闭包
    CSS 高级布局技巧
    window.open打开新窗口被浏览器拦截的处理方法
    Input输入框输入银行卡号自动空格
    关于NSURLSession的上传和下载
    将一个字符串从第40个字节开始替换为@"..."
    IOS开发之高级功能---远程推送
  • 原文地址:https://www.cnblogs.com/tuhooo/p/8641991.html
Copyright © 2011-2022 走看看