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

C语言系统调用linux文件系统

在C语言中,openwriteread函数是系统调用(system calls),它们直接由操作系统提供,用于底层的文件操作。这些函数是UNIX和类UNIX系统(如Linux)中的标准接口,不同于C标准库中的文件操作函数(如fopenfwritefread)。

open

open函数用于打开一个文件或创建一个新文件,并返回一个文件描述符。这个函数在C语言的标准库中定义在<fcntl.h>头文件中。

#include <fcntl.h>int fd = open(const char *pathname, int flags, mode_t mode);
  • pathname:要打开的文件的路径。
  • flags:文件打开的模式标志,例如O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_CREAT(如果文件不存在则创建)等。
  • mode:文件创建时的权限模式,通常是一个三位八进制数,例如0666表示读写权限。

返回值:

  • 成功时返回一个文件描述符(非负整数)。
  • 失败时返回-1,并设置errno
常见的 flags
  1. O_RDONLY:

    • 只读模式打开文件。
    • 文件描述符用于读取操作。
  2. O_WRONLY:

    • 只写模式打开文件。
    • 文件描述符用于写入操作。
  3. O_RDWR:

    • 读写模式打开文件。
    • 文件描述符可以用于读取和写入操作。
  4. O_CREAT:

    • 如果文件不存在,则创建文件。
    • 需要提供 mode 参数来设置文件权限(如果文件被创建)。
  5. O_TRUNC:

    • 如果文件已存在且以写入模式打开,则截断文件为零长度(即清空文件内容)。
  6. O_APPEND:

    • 以追加模式打开文件。
    • 写入数据时,数据将被追加到文件的末尾,而不是覆盖文件的现有内容。
  7. O_EXCL:

    • O_CREAT 一起使用时,如果文件已经存在,则 open 调用失败。
    • 用于确保文件的创建是唯一的。
  8. O_NONBLOCK:

    • 以非阻塞模式打开文件。
    • 读写操作不会阻塞进程,适用于需要非阻塞操作的情况(如管道和套接字)。
  9. O_SYNC:

    • 以同步模式打开文件。
    • 写入操作会在返回前确保数据被写入磁盘,适用于对数据持久性要求高的场景。
  10. O_DSYNC:

  • 以同步模式打开文件。不包括文件的元数据(如修改时间等)
  • 由于 O_DSYNC 不涉及文件的元数据同步,它的性能开销通常低于 O_SYNC。这使得 O_DSYNC 更适合对数据持久性要求高但对元数据一致性要求相对较低的场景。
文件权限(mode)

当使用 O_CREAT 创建文件时,还需要指定文件权限(mode)。这是一个三位八进制数,表示文件的权限。例如:

  • 0666:文件的所有者、组和其他用户都有读写权限。
  • 0644:文件的所有者有读写权限,而组和其他用户只有读权限。
  • 0755:文件的所有者有读、写和执行权限,而组和其他用户只有读和执行权限。

权限模式由三个部分组成,分别表示文件的用户、组和其他用户的权限:

  • 用户权限(Owner permissions):前两位(如6表示读写权限,4表示读权限)。
  • 组权限(Group permissions):中间两位。
  • 其他权限(Other permissions):最后两位。

write

write函数用于向文件写入数据。它在<unistd.h>头文件中定义。

#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
  • fd:文件描述符,通过open函数获得。
  • buf:指向要写入数据的内存区域的指针。
  • count:要写入的字节数。

返回值:

  • 成功时返回实际写入的字节数。
  • 失败时返回-1,并设置errno

read

read函数用于从文件中读取数据。它同样在<unistd.h>头文件中定义。

#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
  • fd:文件描述符,通过open函数获得。
  • buf:指向用来存储读取数据的内存区域的指针。
  • count:要读取的字节数。

返回值:

  • 成功时返回实际读取的字节数(可能小于count)。
  • 返回0表示文件末尾。
  • 失败时返回-1,并设置errno

lseek

lseek 是一个用于调整文件描述符的文件偏移量的系统调用。它可以在文件中设置读写操作的位置。以下是 lseek 的基本用法和参数说明:

off_t lseek(int fd, off_t offset, int whence);
  • fd:文件描述符,通常由 open 系统调用返回。
  • offset:新的偏移量值,具体含义取决于 whence 参数。
  • whence:指定偏移量的起始位置,可以是以下三个常量之一:
    • SEEK_SET:文件的起始位置。
    • SEEK_CUR:文件当前的位置。
    • SEEK_END:文件的末尾位置。

返回值

  • 成功时,lseek 返回新的文件偏移量。
  • 失败时,返回 -1 并设置 errno 以指示错误原因。

综合示例

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main() {int fd = open("out.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);if (fd < 0) {perror("open");exit(EXIT_FAILURE);}// 写入数据const char *message = "Hello World";ssize_t bytesWritten = write(fd, message, strlen(message));if (bytesWritten < 0) {perror("write");close(fd);exit(EXIT_FAILURE);}// 将文件描述符 fd 的偏移量设置到文件的开始位置if (lseek(fd, 0, SEEK_SET) < 0) {perror("lseek");close(fd);exit(EXIT_FAILURE);}// 读取数据char buffer[20];ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);if (bytesRead < 0) {perror("read");close(fd);exit(EXIT_FAILURE);}// 字符串要添加终止符buffer[bytesRead] = '\0';printf("%s\n", buffer);// 关闭文件close(fd);return 0;
}

相关文章:

C语言系统调用linux文件系统

在C语言中&#xff0c;open、write和read函数是系统调用&#xff08;system calls&#xff09;&#xff0c;它们直接由操作系统提供&#xff0c;用于底层的文件操作。这些函数是UNIX和类UNIX系统&#xff08;如Linux&#xff09;中的标准接口&#xff0c;不同于C标准库中的文件…...

LeetCode142 环形链表 II

前言 题目&#xff1a; 142. 环形链表 II 文档&#xff1a; 代码随想录——环形链表 II 编程语言&#xff1a; C 解题状态&#xff1a; 思路错误&#xff0c;链表不允许被修改 思路 两步走&#xff0c;第一步&#xff0c;判断有没有环&#xff0c;第二步&#xff0c;判断入环口…...

逆向案例二十八——某高考志愿网异步请求头参数加密,以及webpack

网址&#xff1a;aHR0cDovL3d3dy54aW5nYW9rYW90Yi5jb20vY29sbGVnZXMvc2VhcmNo 抓包分析&#xff0c;发现请求头有参数u-sign是加密的&#xff0c;载荷没有进行加密&#xff0c;直接跟栈分析。 进入第二个栈&#xff0c;打上断点&#xff0c;分析有没有加密位置。 可以看到参数…...

WebKit的文本装饰艺术:CSS Text Decoration全解析

WebKit的文本装饰艺术&#xff1a;CSS Text Decoration全解析 CSS文本装饰&#xff08;Text Decoration&#xff09;是一组用于美化和增强网页文本表现的属性&#xff0c;它们可以为文本添加下划线、上划线、线删除和强调标记等效果。WebKit作为许多现代浏览器的渲染引擎&…...

【linux】Shell脚本三剑客之sed命令的详细用法攻略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

解析class字节码文件获取魔数和版本号

写在前面 本文看下如何获取class字节码文件的魔数和版本号信息。 1&#xff1a;正文 需要对class字节码的结构有一定的了解&#xff0c;可以参考这篇文章 。 直接看代码&#xff1a; package org.example;import java.math.BigInteger;public class TTTT {//取部分字节码&…...

技术文档总结----思维导图

性能调优| ProcessOn免费在线作图,在线流程图,在线思维导图 mysql| ProcessOn免费在线作图,在线流程图,在线思维导图 kafka| ProcessOn免费在线作图,在线流程图,在线思维导图 mybatis缓存| ProcessOn免费在线作图,在线流程图,在线思维导图 java锁| ProcessOn免费在线作图,在…...

【iOS】—— retain\release实现原理和属性关键字

【iOS】—— retain\release实现原理和属性关键字 1. retain\reelase实现原理1.1 retain实现原理1.2 release实现原理 2. 属性关键字2.1 属性关键字的分类2.2 内存管理关键字2.2.1 weak2.2.2 assgin2.3.3 strong和copy 2.4 线程安全的关键字2.5 修饰变量的关键字2.5.1常量const…...

这一文,关于Java泛型的点点滴滴 一

作为一个 Java 程序员&#xff0c;用到泛型最多的&#xff0c;我估计应该就是这一行代码&#xff1a; List<String> list new ArrayList<>();这也是所有 Java 程序员的泛型之路开始的地方啊。 不过本文讲泛型&#xff0c;先不从这里开始讲&#xff0c;而是再往前…...

微信小程序之调查问卷

一、设计思路 1、界面 调查问卷又称调查表&#xff0c;是以问题的形式系统地记载调查内容的一种形式。微信小程序制作的调查问卷&#xff0c;可以在短时间内快速收集反馈信息。具体效果如下所示&#xff1a; 2、思路 此调查问卷采用服务器客户端的方式进行设计&#xff0c;服…...

基于Qt的视频剪辑

在Qt中进行视频剪辑可以通过多种方式实现&#xff0c;但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤&#xff1a; 使用FFmpeg FFmpeg是一个非常强大的多媒体框架&#xff0c;可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…...

electron 网页TodoList工具打包成win桌面应用exe

参考&#xff1a; electron安装&#xff08;支持win、mac、linux桌面应用&#xff09; https://blog.csdn.net/weixin_42357472/article/details/140643624 TodoList工具 https://blog.csdn.net/weixin_42357472/article/details/140618446 electron打包过程&#xff1a; 要将…...

数据结构之判断二叉树是否为搜索树(C/C++实现)

文章目录 判断二叉树是否为搜索树方法一&#xff1a;递归法方法二&#xff1a;中序遍历法总结 二叉树是一种非常常见的数据结构&#xff0c;它在计算机科学中有着广泛的应用。二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是二叉树的一种特殊形式&…...

golang长连接的误用

误用一&#xff1a;忘记读取响应的body 由于忘记读取响应的body导致创建大量处于TIME_WAIT状态的连接&#xff08;同时产生大量处于transport.go的readLoop和writeLoop的协程&#xff09; 在linux下运行下面的代码: package mainimport ("fmt""html"&qu…...

Springboot @Validate @Valid 基于复杂嵌套对象的参数校验示例

Springboot Validate Valid 基于复杂嵌套对象的参数校验示例 复杂对象 Data public class Object1 {Length(max 50,message "长度不能超过50位字符")NotBlank(message "名称不能为空")private String name;NotNull(message "不能为空")pri…...

算力共享下的,分级路由转发报文协议与通告

目录 网络双 SLA 约束 一、双SLA约束的定义与背景 二、双SLA约束的应用场景 三、双SLA约束的管理与实施 四、双SLA约束的优势与挑战 算力共享下的,分级路由转发报文协议与通告 基础设施即服务(IaaS)类 型算力资源 函数即服务(FaaS)类型算力服务 软件即服务(SaaS…...

滚动数组详解

滚动数组详解 何为滚动数组&#xff1f;滚动数组是如何优化空间的&#xff1f;交替滚动例题&#xff1a;来自某某轮廓线DP的题目 自我滚动(~~不如交替~~ 完结&#xff01;&#xff01;&#xff01; ( 宇宙免责任书&#xff1a;我用的是C) 何为滚动数组&#xff1f; 什么是滚动…...

C 语言动态链表

线性结构->顺序存储->动态链表 一、理论部分 从起源中理解事物&#xff0c;就是从本质上理解事物。 -杜勒鲁奇 动态链表是通过结点&#xff08;Node&#xff09;的集合来非连续地存储数据&#xff0c;结点之间通过指针相互连接。 动态链表本身就是一种动态分配内存的…...

【Leetcode】二十、记忆化搜索:零钱兑换

文章目录 1、记忆化搜索2、leetcode509&#xff1a;斐波那契数列3、leetcode322&#xff1a;零钱兑换 1、记忆化搜索 也叫备忘录&#xff0c;即把已经计算过的结果存下来&#xff0c;下次再遇到&#xff0c;就直接取&#xff0c;不用重新计算。目的是以减少重复计算。 以前面提…...

json数据格式 继续学习

1.定义 轻量级的数据交互格式&#xff0c;可以按照json数据格式去组织和封装数据。 本质是一个带有特定格式的字符串。 2.功能 负责不同编程语言中的数据传递和交互。 3.json数据格式转化 """ 演示json数据和python字典之间的转换 """ impor…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...