Linux系统调用四、lseek()函数详解

article/2025/11/11 2:25:16

🚀文章目录

    • ❀1. 案例:写文件并把写入内容打屏
    • ❀2. lseek移动文件读写位置
    • ❀3. lseek计算文件大小
    • ❀4. lseek拓展文件大小


❀1. 案例:写文件并把写入内容打屏

我们可以通过上一节所讲的read()和write()函数来实现向一个文件中写入内容并把写入内容打印到屏幕的功能。

/************************************************************>File Name  : readandprint.c>Author     : QQ>Company    : QQ>Create Time: 2022年05月13日 星期五 12时11分44秒
************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define BUF_MAX 512 /*buf缓冲区最大值*//*向中文件写入数据并把写入内容打印到标准输出*/
int main(int argc, char* argv[])
{if(argc < 2){printf("not fount file name");return -1;	}int fd = open(argv[1], O_RDWR | O_CREAT);write(fd, "hello linux...", 15);char buf[20];memset(buf, 0, sizeof(buf));int read_size = read(fd, buf, sizeof(buf));if(read_size > 0){write(STDOUT_FILENO, buf, read_size);	/*STDIN_FILENO STDERR_FILENO*/}close(fd);return 0;
}

我们知道,在C语言中,字符串都是以 ‘\0’ 结尾的,比如 “hello linux…” 加上结束符共15字节。

write(fd, "hello linux...", 15);

我们来测试下程序,首先明确一点,字符串会写入相应文件,但是不会打印在屏幕中,这个后面分析。这里先看一下结束符 ‘\0’ 是如何显示的。

可以看到,确实不会打屏,且文件内容已写入。我们通过vim编辑器打开1.txt文件。
在这里插入图片描述
可以看到一个 ‘^@’ 字符,这个就是我们多写入的 ‘\0’ 字符,如果我们把写入字节数15改为14,就没有这个字符了。

❀2. lseek移动文件读写位置

  • 包含头文件
#include <sys/types.h>
#include <unistd.h>
  • 函数原型
off_t lseek(int fd, off_t offset, int whence);
  • 函数功能

    reposition read/write file offset.

  • 函数参数

    • fd:文件描述符
    • offset:偏移量
    • whence:位置
      • SEEK_SET:The offset is set to offset bytes. offset为0时表示文件开始位置。
      • SEEK_CUR:The offset is set to its current location plus offset bytes. offset为0时表示当前位置。
      • SEEK_END:The offset is set to the size of the file plus offset bytes. offset为0时表示结尾位置
  • 函数返回值

    • 成功返回当前位置到开始的长度
    • 失败返回-1并设置errno

下面我们通过上面的案例来分析lseek函数的用法,上面案例测试中说到,字符串已经写入了相应文件,但是并没有打印在屏幕中。这是因为,我们用write()函数写入文件之后,这时候读写位置就指在写完后的那个位置,也就是字符串的后面,这样我们在使用read()函数去读的时候就相当于从写入字符串的后面去读的,所以啥也没读到。这时候,就可以使用lseek()函数来移动读写位置,我们只需在上面代码中加一句话即可。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define BUF_MAX 512 /*buf缓冲区最大值*//*向中文件写入数据并把写入内容打印到标准输出*/
int main(int argc, char* argv[])
{if(argc < 2){printf("not fount file name");return -1;	}int fd = open(argv[1], O_RDWR | O_CREAT);write(fd, "hello linux...", 15);/*读写位置在末尾*//*把读写位置移动到文件首部*/lseek(fd, 0, SEEK_SET);char buf[20];memset(buf, 0, sizeof(buf));int read_size = read(fd, buf, sizeof(buf));if(read_size > 0){write(STDOUT_FILENO, buf, read_size);	/*STDIN_FILENO STDERR_FILENO*/}close(fd);return 0;
}

再测试一下,就发现可以正常打屏了。
在这里插入图片描述

❀3. lseek计算文件大小

利用lseek()函数执行成功时的返回值可以来计算一个文件所占字节的大小。

/************************************************************>File Name  : getsize.c>Author     : QQ>Company    : QQ>Create Time: 2022年05月13日 星期五 18时47分04秒
************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc, char* argv[])
{if(argc < 2){printf("not found filename\n");return -1;	}int fd = open(argv[1], O_RDONLY);int size = lseek(fd, 0, SEEK_END);printf("file size: %d\n", size);close(fd);return 0;
}

运行程序测试结果如下。
在这里插入图片描述

❀4. lseek拓展文件大小

我们知道lseek()函数有三个参数,在前面的案例中,都把第二个参数偏移量offset设置为0来处理的,这样第三个参数就不用加偏移量了,相当于whence位置都是相对于文件首部来计算的。如果我们使用第二个参数offset,并把位置whence设置为文件尾,就相当于在文件尾再偏移offset个字节,这就达到了扩展文件大小的目的。

/************************************************************>File Name  : expandfile.c>Author     : QQ>Company    : QQ>Create Time: 2022年05月13日 星期五 19时02分06秒
************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>int main(int argc, char* argv[])
{if(argc < 2){perror("not found filename: ");return -1;	}int fd = open(argv[1], O_WRONLY);lseek(fd, 10, SEEK_END);close(fd);return 0;
}

编译并运行,然后查看文件大小是否增加。
在这里插入图片描述
通过对比我们发现,文件大小并未增加。这是因为通过lseek()扩展了文件的大小之后,如果我们没有对该文件进行写操作,那么这个扩展的内容默认是不会保存的,所以文件大小不会改变。所以,在扩展后,至少要对文件写一次才能保存,我们对上面程序增加一个写操作,然后进行测试。

int main(int argc, char* argv[])
{if(argc < 2){perror("not found filename: ");return -1;	}int fd = open(argv[1], O_WRONLY);lseek(fd, 10, SEEK_END);write(fd, "a", 1);close(fd);return 0;
}

在这里插入图片描述
我们运行后发现,文件大小从0变成了11,扩展了11个字节,而我们程序中仅指定扩展了10个字节,这是因为我们扩展完后又写入了一个字节a,通过前面的分析我们知道,在lseek()函数执行完毕后,读写位置应该是在文件尾部,这时再写入一个字符就相当于在文件尾部,也就是第11个字节出写入了一个a,保存后最终大小为11字节。我们可以使用vim打开文件查看一下。
在这里插入图片描述

可以看到10个 ‘^@’ 字符,第11个字符为写入的 ‘a’ 。

注:这里用到了一个函数叫做perror(),这个函数是用来打印错误信息的,我们在上面这些函数的返回值都可以看到一条,如果出错会设置errno,而设置errno就是和perror()函数相关联的,通过perror()这个函数就可以把出错信息打印出来。


在这里插入图片描述



http://chatgpt.dhexx.cn/article/fDf6CLJy.shtml

相关文章

windows 安装开启 telnet 服务

本人用的是windows 8.1 不过windows7的开启方法也适用 首先打开控制面板->程序->启用或关闭windows功能 选上Telnet服务器、Telnet客户端 然后按 winr 或者开始->运行 输入services.msc 找到telnet服务, 建议设置成手动启动,之后启动它即可使用telnet命令

window2008开启telnet服务

第一步:查看电脑是否安装telnet 第二步:进入控制面板 第三步:打开或关闭window功能 第四步:功能--添加telnet 第五步:验证 服务器远程管理–远程桌面 window2008开启telnet服务 服务器远程–telnet

Win10开启telnet功能

控制面板里面搜索“启用或关闭 windows 功能” 勾选“Telnet 客户端”

CentOS开启telnet服务

ECS大优惠点我点我&#xff01;&#xff01;&#xff01;红包折扣&#xff0c;阿里云上云大礼包&#xff01;&#xff01;&#xff01; 一、安装telnet-server yum install telnet-server二、启动telnet服务 编辑/etc/xinetd.d/telnet, 将其中的 disable yes 的yes改为no. …

Centos8 开启Telnet服务

环境&#xff1a;Centos8.2 目的&#xff1a;安装Telnet服务为Python程序Telnet源码测试用 首先安装telnet服务 [rootlocalhost ~]# yum install telnet-server 上次元数据过期检查&#xff1a;0:21:09 前&#xff0c;执行于 2020年12月25日 星期五 03时59分46秒。 依赖关系解…

Telnet服务配置

实验环境&#xff1a;ensp&#xff0c;华为命令 实验拓扑&#xff1a; 实验需求&#xff1a; 作为一名网络管理员&#xff0c;为了简化网络设备的管理&#xff0c;通过配置Telnet服务实现远程管理路由器的功能&#xff0c;具体需求如下&#xff1a; 为了方便管理员管理设备&…

NexT 主题自定义侧边栏图标

NexT 主题的图标基本上都是由 Font Awesome 提供&#xff0c;但是知乎、CSDN、bilibili等大多数国内应用软件的图标在Font Awesome都不支持。为了支持侧边栏各种应用小图标的显示&#xff0c;可以利用嵌入svg格式的图标进行实现。 本人博客实现效果如下&#xff1a; 本人使用博…

hexo next 主题安装 livere 评论插件

之前用gitalk评论插件&#xff0c;但是访问github登录授权感人&#xff0c;有时还要开代理&#xff0c;体验不佳&#xff0c;而且每次都要初始化评论&#xff0c;偶然访问别人的博客发现了一款比较好用的评论插件&#xff1a;livere , 我按照官网研究了一会&#xff0c;发现h…

Hexo博客进阶:为 Next 主题添加 Waline 评论系统

前言 在之前的 Hexo博客进阶&#xff1a;为Next主题添加Valine评论系统 | 谢同学的博客 (qianfanguojin.top) 文章中&#xff0c;我叙述了如何 在 Next主题下配置 Valine 评论系统。 但是&#xff0c;根据读者反馈&#xff0c;Valine 评论系统在 Next 主题高版本 (7.) 以上已…

Hexo+Next主题的一些实用插件和美化升级

HexoNext主题的一些实用插件和美化升级 添加右上角图标folk github添加站内搜索主页显示项目moon-cake 进度显示和上下滑动代码颜色首页只显示文章摘要NexT8动画背景Canvas Nest修改链接样式LaTeX公式编辑问题使用mermaid绘制流程图mermaid的flowchart基础语法 访客统计文章目录…

Hexo博客主题安装及Next主题个性化修改

原文链接https://www.lixint.me/hexo-theme-diy.html 欢迎加入博客搭建交流群&#xff08;QQ群号60429576&#xff09;>点击加入< 写在最前面&#xff1a; 1.在修改时请注意博客配置文件与主题配置文件的区别&#xff1a;博客配置文件是指博客根目录下的_config.yml文件…

Hexo-Next主题优化

添加动态背景添加背景图片侧边栏设置头像设置&#xff08;圆形旋转&#xff09;浏览页面显示当前浏览进度添加顶部加载条Hexo-Next代码复制功能 1. 添加动态背景 动态背景就是我的博客背景中动的那些粒子。 只需修改主题配置文件 /themes/next/_config.yml # Canvas-nest c…

基于Hexo搭建Next主题博客

Next 链接地址&#xff1a;https://github.com/caozongpeng/hexo-theme-next NexT 是一个高质量并且优雅的Hexo 主题。这是精心制作做出来的 hexo 主题。 如果你对此主题非常喜欢&#xff0c;欢迎Star & Fork&#xff0c;非常感谢。 预览界面 首页 底部 相册 文章 搜索…

Next主题添加背景图片

文章目录 操作步骤添加背景图片设置透明边框圆角 hexo 和 Next 的版本如下&#xff1a; hexo: 5.2.0 NexT: 7.8.0 操作步骤 进入 themes\next\source\css 目录中打开 main.styl 文件在末尾添加 css 代码即可 添加背景图片 值得注意的是&#xff0c;在 main.styl 文件末尾写的…

Hexo-Next主题博客个性化配置

Hexo版本&#xff1a;6.2.0、NextT版本&#xff1a;7.8.0 一、主题安装 打开Git Bash&#xff0c;cd到站点根目录&#xff0c;输入 git clone https://github.com/theme-next/hexo-theme-next themes/next打开站点根目录下的_config.yml文件&#xff0c;landscape修改为next …

hexo下next主题的优化

1.站点信息的配置。 修改一些基本的配置&#xff0c;比如站点名、站点描述等等。 # Site title: halisi7 subtitle: 一个专注技术的组织 description: 涉猎的主要编程语言为 c语言、Java、mysql、linux、docker&#xff0c;领域涵盖算法、服务研发和对象存储等。 keywords: c…

Hexo博客-NexT主题自定义主页配置方法

Refrence https://zhuanlan.zhihu.com/p/366761432 问题 在使用Hexo博客框架的Next主题时&#xff0c;默认主页是数篇博客的摘要。想要修改主页&#xff08;也即首页&#xff09;的内容&#xff08;例如给出网站的介绍等&#xff09;&#xff0c;需要进行自定义配置。 步骤 …

Hexo-Next主题搭建个人博客最新配置教程!

个人博客 网页预览&#xff1a;https://benn314.github.io/ Hexo-Next 是一款我很喜欢的主题&#xff0c;布局简约&#xff0c;很适合用于搭配 live-2d 和 网格动画&#xff0c;打造属于自己的个人博客。博客目前部署于 Github Pages 相关Github仓库 https://github.com/Ben…

NexT主题优化

前言 这算是各种文章的集合了&#xff0c;如果你有耐心就看完吧(&#xff34;▽&#xff34;) 如果是明确想要哪一种功能的童鞋&#xff0c;那就直接查找吧( • ̀ω•́ )✧ 本篇文章是在已经搭建好gitpagehexo的博客的前提下&#xff08;不懂怎么搭建的可以参考我的另一篇…

Hexo+next主题美化静态博客

前言 需要在Hexo下配置next主题 Hexo配置next主题教程&#xff1a;点我跳转 更改配置以后使用素质三连&#xff1a;hexo clean && hexo g && hexo s即可本地看到效果。 hexo clean && hexo g && hexo s注&#xff1a;部分参考自互联网&…