C语言系统调用linux文件系统
在C语言中,open
、write
和read
函数是系统调用(system calls),它们直接由操作系统提供,用于底层的文件操作。这些函数是UNIX和类UNIX系统(如Linux)中的标准接口,不同于C标准库中的文件操作函数(如fopen
、fwrite
和fread
)。
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
-
O_RDONLY
:- 只读模式打开文件。
- 文件描述符用于读取操作。
-
O_WRONLY
:- 只写模式打开文件。
- 文件描述符用于写入操作。
-
O_RDWR
:- 读写模式打开文件。
- 文件描述符可以用于读取和写入操作。
-
O_CREAT
:- 如果文件不存在,则创建文件。
- 需要提供
mode
参数来设置文件权限(如果文件被创建)。
-
O_TRUNC
:- 如果文件已存在且以写入模式打开,则截断文件为零长度(即清空文件内容)。
-
O_APPEND
:- 以追加模式打开文件。
- 写入数据时,数据将被追加到文件的末尾,而不是覆盖文件的现有内容。
-
O_EXCL
:- 与
O_CREAT
一起使用时,如果文件已经存在,则open
调用失败。 - 用于确保文件的创建是唯一的。
- 与
-
O_NONBLOCK
:- 以非阻塞模式打开文件。
- 读写操作不会阻塞进程,适用于需要非阻塞操作的情况(如管道和套接字)。
-
O_SYNC
:- 以同步模式打开文件。
- 写入操作会在返回前确保数据被写入磁盘,适用于对数据持久性要求高的场景。
-
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语言中,open、write和read函数是系统调用(system calls),它们直接由操作系统提供,用于底层的文件操作。这些函数是UNIX和类UNIX系统(如Linux)中的标准接口,不同于C标准库中的文件…...
LeetCode142 环形链表 II
前言 题目: 142. 环形链表 II 文档: 代码随想录——环形链表 II 编程语言: C 解题状态: 思路错误,链表不允许被修改 思路 两步走,第一步,判断有没有环,第二步,判断入环口…...
逆向案例二十八——某高考志愿网异步请求头参数加密,以及webpack
网址:aHR0cDovL3d3dy54aW5nYW9rYW90Yi5jb20vY29sbGVnZXMvc2VhcmNo 抓包分析,发现请求头有参数u-sign是加密的,载荷没有进行加密,直接跟栈分析。 进入第二个栈,打上断点,分析有没有加密位置。 可以看到参数…...
WebKit的文本装饰艺术:CSS Text Decoration全解析
WebKit的文本装饰艺术:CSS Text Decoration全解析 CSS文本装饰(Text Decoration)是一组用于美化和增强网页文本表现的属性,它们可以为文本添加下划线、上划线、线删除和强调标记等效果。WebKit作为许多现代浏览器的渲染引擎&…...
【linux】Shell脚本三剑客之sed命令的详细用法攻略
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
解析class字节码文件获取魔数和版本号
写在前面 本文看下如何获取class字节码文件的魔数和版本号信息。 1:正文 需要对class字节码的结构有一定的了解,可以参考这篇文章 。 直接看代码: 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 程序员,用到泛型最多的,我估计应该就是这一行代码: List<String> list new ArrayList<>();这也是所有 Java 程序员的泛型之路开始的地方啊。 不过本文讲泛型,先不从这里开始讲,而是再往前…...
微信小程序之调查问卷
一、设计思路 1、界面 调查问卷又称调查表,是以问题的形式系统地记载调查内容的一种形式。微信小程序制作的调查问卷,可以在短时间内快速收集反馈信息。具体效果如下所示: 2、思路 此调查问卷采用服务器客户端的方式进行设计,服…...
基于Qt的视频剪辑
在Qt中进行视频剪辑可以通过多种方式实现,但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤: 使用FFmpeg FFmpeg是一个非常强大的多媒体框架,可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…...
electron 网页TodoList工具打包成win桌面应用exe
参考: electron安装(支持win、mac、linux桌面应用) https://blog.csdn.net/weixin_42357472/article/details/140643624 TodoList工具 https://blog.csdn.net/weixin_42357472/article/details/140618446 electron打包过程: 要将…...
数据结构之判断二叉树是否为搜索树(C/C++实现)
文章目录 判断二叉树是否为搜索树方法一:递归法方法二:中序遍历法总结 二叉树是一种非常常见的数据结构,它在计算机科学中有着广泛的应用。二叉搜索树(Binary Search Tree,简称BST)是二叉树的一种特殊形式&…...
golang长连接的误用
误用一:忘记读取响应的body 由于忘记读取响应的body导致创建大量处于TIME_WAIT状态的连接(同时产生大量处于transport.go的readLoop和writeLoop的协程) 在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…...
滚动数组详解
滚动数组详解 何为滚动数组?滚动数组是如何优化空间的?交替滚动例题:来自某某轮廓线DP的题目 自我滚动(~~不如交替~~ 完结!!! ( 宇宙免责任书:我用的是C) 何为滚动数组? 什么是滚动…...
C 语言动态链表
线性结构->顺序存储->动态链表 一、理论部分 从起源中理解事物,就是从本质上理解事物。 -杜勒鲁奇 动态链表是通过结点(Node)的集合来非连续地存储数据,结点之间通过指针相互连接。 动态链表本身就是一种动态分配内存的…...
【Leetcode】二十、记忆化搜索:零钱兑换
文章目录 1、记忆化搜索2、leetcode509:斐波那契数列3、leetcode322:零钱兑换 1、记忆化搜索 也叫备忘录,即把已经计算过的结果存下来,下次再遇到,就直接取,不用重新计算。目的是以减少重复计算。 以前面提…...
json数据格式 继续学习
1.定义 轻量级的数据交互格式,可以按照json数据格式去组织和封装数据。 本质是一个带有特定格式的字符串。 2.功能 负责不同编程语言中的数据传递和交互。 3.json数据格式转化 """ 演示json数据和python字典之间的转换 """ impor…...
gradle 构建项目添加版本信息
gradle 构建项目添加版本信息,打包使用 spring boot 的打包插件 build.gradle 配置文件 bootJar {manifest {attributes(Project-Name: project.name,Project-Version: project.version,"project-Vendor": "XXX Corp","Built-By": &…...
vue3 学习笔记17 -- 基于el-menu封装菜单
vue3 学习笔记17 – 基于el-menu封装菜单 前提条件:组件创建完成 配置路由 // src/router/index.ts import { createRouter, createWebHashHistory } from vue-router import type { RouteRecordRaw } from vue-router export const Layout () > import(/lay…...
使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题
可以看一下我以前做过的笔记:黑马点评 短信登录部分 基于session实现登录流程 1.发送验证码 用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号 如果手机号合法,后台此时生成对应的验…...
反转链表 - 力扣(LeetCode)C语言
206. 反转链表 - 力扣(LeetCode)( 点击前面链接即可查看题目) /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* reverseList(struct ListNode* head) {if(head NULL)…...
【Linux】进程间通信(1):进程通信概念与匿名管道
人与人之间是如何通信的?举个简单的例子,假如我是月老,我要为素不相识的但又渴望爱情的男女两方牵红线。我需要收集男方的信息告诉女方,收集女方的信息告诉男方,然后由男女双方来决定是否继续。对于他们而言࿰…...
Spring从入门到精通 01
文章目录 1. 依赖注入 (Dependency Injection, DI)2. 面向切面编程 (Aspect-Oriented Programming, AOP)3. 事务管理4. 简化 JDBC 开发5. 集成各种框架和技术6. 模块化和扩展性:主要的 Spring 模块:Core Container:AOP 模块:Data …...
C语言经典习题25
冒泡排序 对一维数组进行升序排序,然后在数组中输入20个数,将排序后的结果打印输出。 #include<stdio.h> #define N 20 int main() {int a[N];int i;for(i0;i<N;i) //初始化数组的数 {scanf("%d",&a);}for(i0;…...
2-47 基于matlab的时域有限差分法(FDTD法)拉夫等效原理进行时谐场外推
基于matlab的时域有限差分法(FDTD法)拉夫等效原理进行时谐场外推。外推边界距离吸收边界的距离、电磁场循环、傅立叶变换提起幅值和相位、各远区剖分点电场、方向系数计算等操作,得出可视化结果。程序已调通,可直接运行。 2-47 时域有限差分法(FDTD法) 拉…...
JupyterNotebook快捷键 自用
COMMAND MODE —————————————————————————————— Up Down cells的上下选择 A B 在上/下方插入cell C V X 复制/粘贴/剪切cell 双击D 删除所选cell Z 恢复被删除的cell 双击I Interrupt中断内核 Shift Enter 运行cell并选择下方 EDIT MODE ———…...
【我的OpenGL学习进阶之旅】讲一讲GL_TEXTURE_2D和GL_TEXTURE_EXTERNAL_OES的区别
在使用OpenGL ES进行图形图像开发时,我们常使用GL_TEXTURE_2D纹理类型,它提供了对标准2D图像的处理能力。这种纹理类型适用于大多数场景,可以用于展示静态贴图、渲染2D图形和进行图像处理等操作。 另外,有时我们需要从Camera或外部视频源读取数据帧并进行处理。这时,我们…...
公司请人做公司网站会计分录/百度关键词优化词精灵
nacos版本:2.0.3 mysql:8.x 此时持久化配置的时候需要给nacos配置文件中数据库连接配置添加以下信息: allowPublicKeyRetrievaltrue完整配置: spring.datasource.platformmysql db.num1 # note: must use ruoyi-mysql as the d…...
武汉培训网站建设/专业黑帽seo
这个问题我遇到过,你可以从以下几个思路去找解决方法,1、看下是不是这个页面本身的问题;2、是不是各个手机主题不同的原因,如果应用其他部分正常,就这个页面不正常的话,这个可以排除;3、是不是多…...
学校建设网站/宁波seo推广公司排名
原标题:Python干货:黑客们会用到哪些关于Python技术?Python已经成为漏洞开发领域的行业标准,读者会发现大多数概念验证工具都是用Python语言编写的(除了用Ruby写的安全漏洞检测工具)。Python允许开发者编写脚本处理远程服务&#…...
西安单位网站制作/百度百科词条创建入口
前言 Python是现在非常火的一门编程语言,相信很多同学都想学习它,而且目的各不相同:有的是为了做爬虫、做后端;有的是为了做图形界面;有的是为了做数据分析、自动化办公;还有的是为了做深度学习、CV、NLP……...
国外网站建设的发展/产品营销策划方案3000字
一,概念 加法 乘法 减法 除法 二,二进制,十进制,十六进制转化 二进制转十进制 十进制转二进制 二进制转十六进制 十六进制转二进制 三,原码,反码,补码 正数 负数 四,操…...
做羞羞的事情视频网站/seo公司服务
安装matlab sudo mkdir -p /mnt/matlab sudo mount -t auto -o loop /home/chris/Downloads/2016b_linux/R2016b_glnxa64_dvd1.iso /mnt/matlab用鼠标操作若干步骤。。提示插入第二块镜像文件。sudo mount -t auto -o loop /home/chris/Downloads/2016b_linux/R2016b_glnxa64_d…...