Linux系统调用之lseek函数

这篇具有很好参考价值的文章主要介绍了Linux系统调用之lseek函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

如果,想要深入的学习Linux系统调用函数lseek了话,还是需要去阅读Linux系统中的帮助文档的。
具体输入命令:

man 2 lseek

即可查阅到完整的资料信息。

lseek函数

lseek函数是Linux系统API中的一员,它的官方定义是:重新定位读或写的文件偏移量。
这里科普一下什么叫做当前文件偏移量:

  • 每当打开一个文件,都会有一个叫做“当前文件偏移量”的东西,如果难理解也可以将他理解为指针。 除非打开文件时指定O_APPEND选项,否则文件偏移量默认设置为0。当我们发生了一次读或者写操作时,都会使这个当前文件偏移量发生变化,读/写多少字节,当前偏移量就会向后移动多少。

知道了这个概念了后,我们就了解了lseek函数它有些什么作用。下面我们来细细介绍一下这个函数。

它的函数原型是长这样的:

off_t lseek(int fd, off_t offset, int whence);

先来说一下这个off_t类型吧,它用于指示文件的偏移量。你可以就简单的理解为这是一个64位的整形数,相当于long long int,其定义在unistd.h头文件中可以查看。

在使用这个函数之前,我们需要往C/C++文件中导入这些头文件:

#include <sys/types.h>
#include <unistd.h>

通过lseek函数的函数原型我们可以知道,我们需要给它传入3个参数,那我们依次介绍这三个参数是什么,有什么含义在里面。

  • PS:题外话,如果有听不懂的地方,请自行查阅Linux帮助文档,开头有些查阅方法,一手知识永远是最好的知识。

参数:fd //文件描述符,可以通过open函数得到,通过这个fd可以操作某个文件
参数: offset //文件偏移量,是一个整形数
参数:whence //偏移类型,下列三个值中选一个。

whence :
SEEK_SET:该文件的偏移量设为离文件开头offset个字节.
SEEK_CUR:该文件的偏移量设为其当前值加offset(PS :offest可正负).
SEEK_END:该文件的偏移量设为文件长度加offset

再来聊一下返回值:

如果成功:返回文件指针的位置
如果失败:返回-1,并将错误原因赋值给errno,我们可以用标准C库中的perror函数打印出错误原因。需要引入头文件 #include <stdio.h>

lseek函数的作用

lseek函数的作用有以下四点:

  • 1.移动文件指针到文件头:

    lseek(fd, 0, SEEK_SET);

  • 2.获取当前文件指针的位置

    lseek(fd, 0, SEEK_CUR);

  • 3.获取文件长度

    lseek(fd, 0, SEEK_END);

  • 4.拓展文件的长度,当前文件10b, 110b, 增加了100个字节

    lseek(fd, 100, SEEK_END)
    注意:拓展完需要再写一次数据,否则拓展无效

光这样介绍不可能学的会,我们来通过一个实战例子来彻底了解一下这个lseek函数

实战演练:lseek函数

作用1:移动文件指针到文件头:

//导入所有需要的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

//我们的目的是:移动文件指针到文件头:
int main()
{
    //获取文件的文件描述符
    int fd = open("text.txt", O_RDWR);
    if (fd == -1)
    {
        perror("open");
        return -1;
    }

    //输出当前文件的偏移量
    long long int loc = lseek(fd, 0, SEEK_CUR);
    printf("%lld\n", loc);

    //使用read函数读3个字节的数据
    char buf[3] = {0};
    int rnum = read(fd, buf, sizeof(buf));
    printf("%d\n", rnum);

    //再次查看文件的偏移量
    long long int loc1 = lseek(fd, 0, SEEK_CUR);
    printf("%lld\n", loc1);

        //移动文件指针到文件头
    long long int loc2 = lseek(fd, 0, SEEK_SET);
    printf("%lld\n", loc2);

    return 0;
}

作用2:获取当前文件指针的位置

//导入所有需要的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    //导入所有需要的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    //获取文件的文件描述符
    int fd = open("hello.txt", O_RDWR);

    //输出当前文件的偏移量
    long long int loc = lseek(fd, 0, SEEK_CUR);
    printf("%lld\n", loc);

    //使用read函数读2个字节的数据
    char buf[2] = {0};
    int rnum = read(fd, buf, sizeof(buf));
    printf("%d\n", rnum);

        //再次查看文件的偏移量
    long long int loc1 = lseek(fd, 0, SEEK_CUR);
    printf("%lld\n", loc1);

    return 0;
}
}

作用3:获取文件长度

//导入所有需要的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    //获取文件的文件描述符
    int fd = open("hello.txt", O_RDWR);


    //获取文件长度
    long long int loc1 = lseek(fd, 0, SEEK_END);
    printf("%lld\n", loc1);

    return 0;
}

作用4:拓展文件的长度(注:拓展完需要再写一次数据,否则拓展无效)

//导入所有需要的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    //获取文件的文件描述符
    int fd = open("hello.txt", O_RDWR);


    //获取文件长度
    long long int loc1 = lseek(fd, 0, SEEK_END);
    printf("%lld\n", loc1);

    //拓展文件的长度
    long long int loc2 = lseek(fd, 100, SEEK_END);
    write(fd," ",1);//写入一个空数据
    printf("%lld\n", loc2);


    return 0;
}

总结

当明白了当前文件偏移量这个概念了以后,lseek函数也变的并不是那么难理解了。仔细试了一下lseek函数的功能还挺好玩的。文章来源地址https://www.toymoban.com/news/detail-650761.html

到了这里,关于Linux系统调用之lseek函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

    本文思维导图概述的主要内容: 1.1 什么是 crontab Crontab 是一个在 Unix 和 Linux 操作系统上 用于定时执行任务 的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab 是 cron table 的缩写, cron 指的是 Unix 系统中的一个后台进程,它

    2024年02月08日
    浏览(92)
  • 【Linux运维】shell脚本检查服务器内存和CPU利用率

    在管理服务器时候写了一个 shell脚本,在服务上实现每天凌晨3点查系统的指定文件夹下的容量大小,如果超过10G就要删除3天前的内容,还要时刻查询内存和cpu利用率,如果超过80%就要提示用户出现过载 将以上代码保存为一个.sh文件,然后通过crontab在每天凌晨3点运行即可:

    2024年02月09日
    浏览(67)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(82)
  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(98)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(94)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(55)
  • [最新搭建教程]0基础Linux CentOS7系统服务器本地安装部署ChatGPT模型服务搭建/免费域名绑定网页Https访问/调用open AI的API/GPT3/GPT3.5/GPT4模型接口

    一、关于此文 本文介绍了如何克隆一个开源的项目,通过请求调用OpenAI ChatGPT模型接口,以使用ChatGPT的强大功能。相比于直接登录ChatGPT官网对话,此方法对话过程更为流畅,不会频频出现限流导致对话中断或网络异常;此外,部署完成后无需魔法即可访问,可分享给亲朋好

    2024年02月10日
    浏览(57)
  • Linux下std::ifstream成员函数对应系统调用验证

    最近在分析离线数据使用时的bug,发现代码中对std::ifstream成员函数使用存在疑问,所以就写了个简单测试程序来分析std::ifstream成员函数对应那些系统调用。 目录 1.gcount 2.seekg和tellg 3.read 代码如下: test.cpp 编译执行: g++ -g -o test test.cpp  strace -ff -o ./out  ./test    原始代码:

    2024年02月11日
    浏览(33)
  • linux重装系统步骤 包含raid【主要针对服务器重装】,腾讯Linux运维开发面试记录

    8 、查看网关主机名: cat /etc/sysconfig/network 9 、查看单条网卡信息: ethtool 物理网卡名 比如有很多网卡 ,不知道 使用哪个网卡的时候,就用这个方法。 (万兆网Link为yes就是使用的网卡) ​​ 10、查看cpu内存 查看cpu 最简单方法:输入 top 后按 1 即可查看。 查看CPU信息(型号

    2024年04月12日
    浏览(49)
  • 【Linux操作系统】深入理解系统调用中的read和write函数

    在操作系统中,系统调用是用户程序与操作系统之间进行交互的重要方式。其中,read和write函数是常用的系统调用函数,用于在用户程序和操作系统之间进行数据的读取和写入。本文将深入介绍read和write函数的工作原理、用法以及示例代码,以帮助读者更好地理解和应用这两

    2024年02月13日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包