• Linux应用编程之lseek详解


    Linux应用编程之lseek详解

    1、lseek函数介绍

    (1)、文件指针:当我们要对一个文件进行读写时,一定要先打开这个文件,所以我们读写的所有文件都是动态文件。动态文件在内存中的形态就是文件流的形式。

    (2)、文件流很长,里边有很多个字节。那我们当前正在操作的是哪一个位置呢?GUI模式下的软件用光标来标识这个当前正在操作的位置,这个是给人看的。

    (3)、在动态文件中,我们会通过文件指针来表征这个正在操作的位置。所谓文件指针,就是我们文件管理表这个结构体里边的一个指针。所以文件指针其实是vnode中的一个元素。这个指针表示我们当前正在操作文件流的哪个位置。这个指针不能被直接访问,Linux系统用lseek函数来访问这个文件指针。

    (4)、当我们打开一个空文件时,默认情况下文件指针指向文件流的开始。所以这时候去写write时写入的就是从文件开头开始的。write和read函数本身自带移动文件指针的功能,所以我们write了n个字节后,文件指针会自动向后移动n位。如果需要人为的随意更改文件指针,那就只能通过lseek函数了。

    (5)、read和write函数都是从当前文件指针出开始操作的,所以当我们用lseek函数将文件指针移动后,那么再去read/write时就是从移动过后的位置开始的了。

    2、用lseek计算文件长度

    (1)Linux中并没有一个函数可以直接返回一个文件的长度。但是我们做项目时经常会需要知道一个文件的长度,怎么办?自己利用lseek来写一个函数得到文件长度。

    我们用lseek将文件指针移动到末尾,然后返回值就是文件指针距离文件开头的偏移量,也就是文件的长度了。 

    ret = lseek(fd, 0, SEEK_END);

    3、用lseek构建空洞文件

    (1)、空洞文件就是文件中有一段是空的。

    (2)、普通文件中间是不能有空的,因为我们write时文件指针是依次从前向后去移动的,不可能绕过前面直接到后面。

    (3)、我们打开一个文件后,用lseek往后跳过一段,再write写入一段,就会构成一个空洞文件。

    (4)、空洞文件方法对多线程共同操作文件是及其有用的。有时候我们创建一个很大的文件,如果从头开始依次构建的话,时间会很长。有一种思路就是将文件分为多段,然后多线程来操作每个线程负责其中一段的写入。

    4、补充文件,今天学习的时候,发现有个代码没看明白,后来上网查,才弄明白

    int main(int argc, char *argv)

    int argc, char **argv 用于运行时,把命令行的参数传入主程序。

    argc -- 命令行参数的 总个数,包括 可执行程序名。
    argv[i] -- 第 i 个参数。
    argv[0] -- 可执行程序名。

    例如运行:
    ./a.out
    argc 等于 1, argv[0] 是 "a.out"=


    例如运行:
    ./a.out  b  5.2
    argc 等于 3, argv[0] 是 "a.out", argv[1] 是 "b", argv[2] 是 "5.2".

  • 相关阅读:
    LeetCode 338. 比特位计数
    LeetCode 208. 实现 Trie (前缀树)
    初识restful api接口
    破解 Navicat Premium 12
    ES6 Reflect的认识
    ES6 WeakMap和WeakSet的使用场景
    sublime 注释模版插件DocBlockr的使用
    js call方法的使用
    ES6 Generator的应用场景
    ES6 Symbol的应用场景
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11105952.html
Copyright © 2020-2023  润新知