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".

Linux应用编程之lseek详解的更多相关文章

  1. 高并发网络编程之epoll详解(转载)

    高并发网络编程之epoll详解(转载) 转载自:https://blog.csdn.net/shenya1314/article/details/73691088 在linux 没有实现epoll事件 ...

  2. Linux系统编程(36)—— socket编程之UDP详解

    UDP 是User DatagramProtocol的简称,中文名是用户数据报协议.UDP协议不面向连接,也不保证传输的可靠性,例如: 1.发送端的UDP协议层只管把应用层传来的数据封装成段交给IP协 ...

  3. Linux系统编程(31)—— socket编程之TCP详解

    TCP有源端口号和目的端口号,通讯的双方由IP地址和端口号标识.32位序号.32位确认序号.窗口大小稍后详细解释.4位首部长度和IP协议头类似,表示TCP协议头的长度,以4字节为单位,因此TCP协议头 ...

  4. 高并发网络编程之epoll详解

    select.poll和epoll的区别 在linux没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序.在大数据.高并发.集群等一些名词 ...

  5. 网络编程之Socket详解

    在说socket之前.我们先了解下相关的网络知识: 端口   在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上 ...

  6. linux网络编程之shutdown() 与 close()函数详解

    linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这 ...

  7. 【Python】Linux crontab定时任务配置方法(详解)

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...

  8. Linux上的free命令详解、swap机制

    Linux上的free命令详解   解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free ...

  9. linux PHP 编译安装参数详解

    linux PHP 编译安装参数详解 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...

随机推荐

  1. 小程序实现textarea行数自动增加

    查找网上案例很多,但是都不是很满意,参考大牛案例终结了一下,话不多说代码如下: 实现效果: 前段代码 <view class="text-box"> <view& ...

  2. 8 —— node —— 响应一切 html 需要的静态资源

      fs.readFile('.'+urls, function (err, data) {   res.end(data)   });

  3. Linux Shell编程case语句

    http://blog.csdn.net/dreamtdp/article/details/8048720 case语句适用于需要进行多重分支的应用情况. case分支语句的格式如下: case $变 ...

  4. /Array.CreateInstance创建类型为int,长度为5的数组

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  5. zset底层数据结构

    redis zset底层数据结构 https://www.jianshu.com/p/fb7547369655 跳跃列表(Skip List)与其在Redis中的实现详解 https://www.ji ...

  6. WordPress站点绑定多个域名

    refer to https://blog.csdn.net/wzl505/article/details/54970321 打开根目录下的 wp-config.php 文件,找到 require_o ...

  7. ArchLinux安装(BIOS)

    ArchLinux安装(BIOS) 说在前头:在经历过无数次的失败尝试过后总结出的可用的安装过程(比官方的简单一点) 官方安装指导 一.连接网络 1.连接 # wifi-menu 2.检查是否联通 ( ...

  8. swiper用axios异步请求后 循环失效

    解决方案 使用ajax动态获取数据  当数据还没有收到的时候,swiper组件收到的是跟组件data传过来的空数组,会造成渲染问题 这个时候可以给swiper组件 设置一个  v-if='list.l ...

  9. Sequence Models Week 2 Operations on word vectors

    Operations on word vectors Welcome to your first assignment of this week! Because word embeddings ar ...

  10. .NET 软件下面win10自动启动配置

    1.设置所有用户登录都能启动,打开文件夹 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 2.给要启动的应用程序创建快捷方式, ...