当前位置: 首页 > news >正文

Linux- open() lseek()

文件描述符

文件描述符(File Descriptor,简称 FD)是 UNIX 和 UNIX-like 系统中用于代表和识别打开的文件或其他I/O资源的一种抽象标识。它是一个非负整数,内部由操作系统进行管理和分配。文件描述符可以代表文件、套接字、管道等各种类型的I/O资源。

核心概念:

  1. 标准文件描述符:当一个进程启动时,它默认会拥有三个已经打开的文件描述符。

    • 0 - 标准输入(STDIN)
    • 1 - 标准输出(STDOUT)
    • 2 - 标准错误输出(STDERR)
  2. 分配:当新的文件或其他I/O资源被打开时(例如使用 open()socket()),操作系统会为它分配最小的可用文件描述符

  3. 生命周期:文件描述符在资源打开时被创建,当资源被关闭时(例如使用 close())被回收。

  4. 重定向:在 shell 编程中,可以重定向文件描述符,将输出写入文件或从文件中读取输入。

  5. :内核维护一个文件描述符表,每个进程都有其自己的文件描述符表。表中的每个条目都指向一个文件、套接字或其他类型的I/O资源。

  6. 限制:每个进程都有一个文件描述符的上限,即它可以同时打开的最大文件数量。这个上限可以通过 ulimit 命令查看和修改(在某些系统中)。

使用文件描述符的例子:

  • 使用 open() 打开文件:

    int fd = open("example.txt", O_RDONLY);
    if (fd == -1) {perror("open");
    }
    
  • 使用 read() 从文件描述符读取数据:

    char buffer[256];
    ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
    
  • 使用 write() 向文件描述符写入数据:

    const char *message = "Hello, world!";
    ssize_t bytes_written = write(fd, message, strlen(message));
    
  • 使用 close() 关闭文件描述符:

    close(fd);
    

文件描述符是 UNIX 和 UNIX-like 系统中低级I/O操作的核心。然而,在许多应用编程场景中,高级I/O函数(如标准C库中的 fopen(), fread(), fwrite() 等)提供了更简洁和可移植的接口,它们在内部使用文件描述符,但为开发者提供了更高级和更便于使用的抽象。

open()

open() 是在 UNIX 和 Linux 系统编程中常用的一个系统调用,用于打开或创建文件。一旦文件被打开,open() 会返回一个文件描述符,这是一个非负整数,可以用来引用该文件进行进一步的操作(如读、写或关闭文件)。

函数原型

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

第二个原型允许为新创建的文件指定权限。

参数

  1. pathname: 要打开或创建的文件的路径名。
  2. flags: 指定如何打开文件的标志。这些标志可以组合使用(使用 | 运算符)。常见的标志有:
    • O_RDONLY: 以只读方式打开文件。
    • O_WRONLY: 以只写方式打开文件。
    • O_RDWR: 以读写方式打开文件。
    • O_CREAT: 如果文件不存在,则创建文件。
    • O_EXCL: 与 O_CREAT 一起使用,确保文件在被创建时是新的,即如果文件已存在则调用失败。
    • O_TRUNC: 如果文件已存在且成功以写方式打开,则截断文件的长度为0。
    • O_APPEND: 打开文件进行追加(每次写都写在文件末尾)。
  3. mode: 当使用 O_CREAT 标志时,该参数用于指定新文件的权限。它是一个八进制数,如 0644,表示文件所有者有读写权限,而组成员和其他用户只有读取权限。

返回值

  • 成功时返回一个非负整数,即文件描述符。
  • 失败时返回 -1,并设置 errno 以指示错误。

示例

  1. 只读方式打开一个已存在的文件
int fd = open("test.txt", O_RDONLY);
  1. 读写方式打开一个文件,如果文件不存在则创建它,并设置权限为 0644
int fd = open("test.txt", O_RDWR | O_CREAT, 0644);
  1. 只写方式打开一个文件以追加内容
int fd = open("test.txt", O_WRONLY | O_APPEND);

使用 open() 打开的文件应当在完成操作后使用 close() 函数关闭。这是良好的编程实践,可以避免资源泄漏。

lseek()

lseek() 是一个 UNIX 和 Linux 系统调用,用于改变文件描述符所指示的文件的当前读/写位置。这个系统调用允许应用程序随机访问文件中的任何位置,而不仅仅是连续地读取或写入文件。

原型

其函数原型如下:

#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);

参数

  • fd: 文件描述符,通常是之前由 open() 函数返回的。
  • offset: 相对于基准点(由 whence 参数指定)的字节偏移量。
  • whence: 基准点,可以是以下之一:
    • SEEK_SET: 文件的开始位置。
    • SEEK_CUR: 文件的当前位置。
    • SEEK_END: 文件的结束位置。

返回值

  • 如果成功,lseek() 返回新的文件偏移量(相对于文件开始的位置)。
  • 如果失败,返回 -1 并设置 errno

示例

下面是一个简单的示例,展示了如何使用 lseek()

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>int main() {int fd;off_t position;fd = open("test.txt", O_RDWR);if (fd == -1) {perror("Error opening the file");return 1;}// Move file pointer 10 bytes from the startposition = lseek(fd, 10, SEEK_SET);if (position == (off_t) -1) {perror("lseek error");close(fd);return 1;}printf("Current file position: %ld\n", position);close(fd);return 0;
}

在这个示例中,我们首先打开一个名为 “test.txt” 的文件。然后,我们使用 lseek() 将文件指针从文件的开始位置向前移动10个字节。最后,我们输出了文件的新位置并关闭了文件。

需要注意的是,并不是所有的文件类型都支持 lseek()。例如,尝试在某些类型的设备文件或管道上使用 lseek() 可能会失败。

相关文章:

Linux- open() lseek()

文件描述符 文件描述符&#xff08;File Descriptor&#xff0c;简称 FD&#xff09;是 UNIX 和 UNIX-like 系统中用于代表和识别打开的文件或其他I/O资源的一种抽象标识。它是一个非负整数&#xff0c;内部由操作系统进行管理和分配。文件描述符可以代表文件、套接字、管道等…...

Halcon Tuple相关算子(一)

(1) tuple_length( : : Tuple : Length) 功能&#xff1a;返回输入元组中元素的个数。 控制输入参数&#xff1a; Tuple&#xff1a;输入元组&#xff1b; 控制输出参数&#xff1a;length&#xff1a;输入元组中元素的个数。 (2) tuple_find( : : Tuple, ToFind : Indices…...

基于图像形态学处理的路面裂缝检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................... %1&#xff1a;从文件夹中读取多个…...

PY32F003F18之窗口看门狗

一、PY32F003F18窗口看门狗特点&#xff1a; 即使窗口看门狗被禁止&#xff0c;窗口看门狗的"递减计数器"也会继续递减计数。 二、窗口看门狗复位的条件&#xff1a; 1、将"控制寄存器WWDG_CR"中的WDGA1,激活"窗口看门狗计数器等于0x3F"时,则产…...

SpingBoot:整合Mybatis-plus+Druid+mysql

SpingBoot&#xff1a;整合Mybatis-plusDruid 一、特别说明二、创建springboot新工程三、配置3.1 配置pom.xml文件3.2 配置数据源和durid连接池3.2.1 修改application.yml3.2.2 新增mybatis-config.xml 3.3 编写拦截器配置类 四、自动生成代码五、测试六、编写mapper.xml&#…...

计算机视觉与深度学习-经典网络解析-VGG-[北邮鲁鹏]

目录标题 VGG参考VGG网络贡献使用尺寸更小的$3 \times 3$卷积串联来获得更大的感受野放弃使用$11 \times 11$和$5 \times 5$这样的大尺寸卷积核深度更深、非线性更强&#xff0c;网络的参数也更少&#xff1b;去掉了AlexNet中的局部响应归一化层(LRN)层。 网络结构主要改进输入…...

入门级制作电子期刊的网站推荐

随着数字化时代的到来&#xff0c;越来越多的人开始尝试制作自己的电子期刊。如果你也是其中的一员&#xff0c;那么这篇文章可以帮助你制作电子期刊。无论是初学者还是有一定经验的制作者&#xff0c;都能快速完成高质量的电子期刊制作 小编经常使用的工具是-----FLBOOK在线制…...

软件测试内容整理

1. 软件测试 1.1. 定义 软件测试&#xff08;英语&#xff1a;Software Testing&#xff09;&#xff0c;描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说&#xff0c;软件测试是一种实际输出与预期输出之间的审核或者比较过程。 软件测试的经典定…...

UniAccess Agent卸载

异常场景&#xff1a; UniAccess Agent导致系统中的好多设置打不开 例如:ipv4的协议,注册表,host等等 需要进行删除,亲测有效,及多家答案平凑的 借鉴了这位大神及他里面引用的大神的内容 https://blog.csdn.net/weixin_44476410/article/details/121605455 问题描述 这个进…...

【C++】C++11——构造、赋值使用条件和生成条件

移动构造和移动赋值生成条件移动构造和移动赋值调用逻辑强制生成默认函数的关键字default禁止生成默认函数的关键字delete 移动构造和移动赋值生成条件 C11中新增的移动构造函数和移动赋值函数的生成条件为&#xff1a; 移动构造函数的生成条件&#xff1a;没有自己实现的移动…...

【LeetCode热题100】--56.合并区间

56.合并区间 排序&#xff1a; 如果按照区间的左端点排序&#xff0c;那么在排完序的列表中&#xff0c;可以合并的区间一定是连续的&#xff0c;如下图所示&#xff0c;标记为蓝色、黄色和绿色的区间分别可以合并为一个大区间&#xff0c;它们在排完序的列表中是连续的 算法&a…...

opencv dnn模块 示例(17) 目标检测 object_detection 之 yolo v5

在前文【opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4】介绍的yolo v4后的2个月&#xff0c;Ultralytics发布了YOLOV5 的第一个正式版本&#xff0c;其性能与YOLO V4不相伯仲。 文章目录 1、Yolo v5 和 Yolo v4 的区别说明1.1、Data Augmentation - 数据增强1…...

关于安卓SVGA浅尝(一)svgaplayer库的使用

关于安卓SVGA浅尝&#xff08;一&#xff09;使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项目中…...

【LFU】一文让你弄清 Redis LFU 页面置换算法

上一次&#xff0c;相信大家已经知道关于 LRU 页面置换算法的思想和实现了&#xff0c;这里可以一键直达&#xff1a; 【LRU】一文让你弄清 Redis LRU 页面置换算法 Redis 的淘汰策略中&#xff0c;关于 LFU 页面置换算法&#xff0c;今天咱们来捋一捋到底思想是啥&#xff0…...

Python爬虫实战:用简单四步爬取小红书图片

小红书是一个热门的社交分享平台&#xff0c;汇聚了大量精美的图片。如果您希望保存或使用这些图片&#xff0c;本文将为您详细介绍如何使用Python爬虫轻松爬取小红书图片。 一、安装必要的库 在开始之前&#xff0c;确保您已经安装了以下Python库&#xff1a; requests&#…...

行为型模式-解释器模式

提供了评估语言的语法或表达式的方式&#xff0c;它属于行为型模式。这种模式实现了一个表达式接口&#xff0c;该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 意图&#xff1a;给定一个语言&#xff0c;定义它的文法表示&#xff0c;并定义一个解释…...

Linux系统编程(五):信号

参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 系统编程 1. 信号基础理论 1.1 概念和机制 概念 信号在生活中随处可见&#xff0c;如&#xff1a;古代战争中摔杯为号、现代战争中的信号弹、体育比赛中使用的信号枪他们都有共性&#xff1a;简单、不能携带大量信息、满足…...

学习路之工具--SecureCRT的下载、安装

百度盘&#xff1a; 链接: https://pan.baidu.com/s/1r3HjEj053cKys54DTqLM4A?pwdgcac 提取码: gcac 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 感谢大佬 简单介绍下SecureCRT SecureCRT是一款支持SSH&#xff08;SSH1和SSH2&#xff09;的终端仿真程序&a…...

软件定义网络-OpenvSwitch

软件定义网络&#xff08;SDN&#xff09;。它主要有以下三个特点&#xff1a; 控制与转发分离&#xff1a;转发平面就是一个个虚拟或者物理的网络设备&#xff0c;就像小区里面的一条条路。控制平面就是统一的控制中心&#xff0c;就像小区物业的监控室。它们原来是一起的&…...

Android Update Engine 分析(二十三)如何在升级后清除用户数据?

文章目录 0. 导读1. 擦除用户数据流程1.1 制作升级包阶段1. 制作升级包的 "--wipe-user-data" 选项2. 什么是 POWERWASH?1.2 OTA 升级阶段1. payload_properties.txt 文件中的 "POWERWASH=1"2. ApplyPayload 函数设置 InstallPlan3. PostinstallRunnerAct…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...