C语言 linux文件操作(一)
文章目录
- 一、linux文件权限
- 1.1文件描述符
- 1.2文件描述符的范围和默认值
- 1.3打开文件和文件描述符
- 1.4标准文件描述符
- 1.5文件描述符的重定向和关闭
- 1.6I/O 操作
- 1.7使用文件描述符进行进程通信
- 1.8资源限制
- 二、C语言文件读写
- 2.1open 函数
- 2.2 flags参数详解
- 2.3 lseek 函数
一、linux文件权限
字符表示法 二进制 十进制 说明
r - - 100 4 仅可读
- w - 010 2 仅可写
- - x 001 1 仅可执行
r w - 110 6 可读可写
r - x 101 5 可读可执行
- w x 011 3 可写可执行
r w x 111 7 可读可写可执行
- - - 000 0 无权限
1.1文件描述符
在 Linux 系统中,文件描述符是用于访问文件、设备、套接字和其他 I/O 资源的抽象概念。它是一个非负整数,用于唯一标识一个打开的文件或者 I/O 通道。Linux 将所有的 I/O 资源(包括文件、管道、套接字等)都视为文件,并通过文件描述符进行访问。
下面是文件描述符的一些关键特性和使用情况:
1.2文件描述符的范围和默认值
- 文件描述符的范围通常是从 0 开始递增的整数。0、1 和 2 分别是标准输入、标准输出和标准错误输出的文件描述符。在大多数情况下,系统会将第一个打开的文件赋予文件描述符 3,然后依次递增分配给其他打开的文件或者 I/O 通道。
1.3打开文件和文件描述符
- 使用系统调用如
open()、socket()、pipe()等来打开文件或创建 I/O 通道时,会返回一个文件描述符。 - 例如,
open()打开文件后返回一个文件描述符,你可以使用这个描述符进行读取、写入或其他操作。
1.4标准文件描述符
- 0:标准输入(stdin)
- 1:标准输出(stdout)
- 2:标准错误输出(stderr)
1.5文件描述符的重定向和关闭
- 可以使用系统调用如
dup()、dup2()来复制文件描述符或者将一个文件描述符重定向到另一个文件描述符上。 - 使用
close()可以关闭一个文件描述符,释放系统资源。关闭文件描述符后,相应的文件或 I/O 通道不再被该描述符引用。
1.6I/O 操作
- 通过文件描述符,可以进行读取、写入、定位文件指针和其他 I/O 操作。
- 例如,
read()、write()等系统调用使用文件描述符来执行对文件的读取和写入操作。
1.7使用文件描述符进行进程通信
- 文件描述符在进程间通信(IPC)中扮演重要角色,比如通过管道、套接字、匿名管道等进行进程间通信时,文件描述符的传递和共享是常见的做法。
1.8资源限制
- 系统对文件描述符数量有限制,可通过 ulimit 命令查看和设置文件描述符的数量限制。
文件描述符的使用对于在 Linux 系统下进行 I/O 操作和进程通信非常重要。它提供了一种标准化的方法来访问不同类型的 I/O 资源,简化了对文件和其他 I/O 设备的操作。
二、C语言文件读写
int open(const char *pathname, int flags);
2.1open 函数
open 函数用于打开一个文件,并返回一个文件描述符(file descriptor),这个描述符可以用于后续的文件读写操作。
语法:
#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);
-
pathname是要打开的文件的路径名。 -
flags是打开文件时的标志,它可以指定文件的打开方式(例如只读、只写、追加等)。一些常用的标志包括:O_RDONLY: 只读方式打开文件O_WRONLY: 只写方式打开文件O_RDWR: 读写方式打开文件O_CREAT: 如果文件不存在则创建文件O_APPEND: 追加方式打开文件- 等等(可以使用按位或
|连接多个标志)。
-
mode是一个权限参数,仅在使用O_CREAT标志创建文件时才需要。它指定了文件的权限,比如0644。
返回值:
- 如果成功,
open函数返回一个非负整数的文件描述符,可以用于后续的文件 I/O 操作。 - 如果失败,返回值为 -1,并设置全局变量
errno表示出错的原因。
示例:
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>int main() {int fd;fd = open("example.txt", O_WRONLY | O_CREAT, 0644);if (fd == -1) {perror("open");return 1;}// 可以在这里进行文件写操作等close(fd);return 0;
}
2.2 flags参数详解
- O_CREAT:在文件打开过程中创建新文件
- O_RDONLY:以只读方式打开文件。
- O_WRONLY:以只写方式打开文件。
- O_RDWR:以读写方式打开文件。
- O_APPEND:在文件末尾追加数据,而不是覆盖现有内容。
- O_TRUNC:如果文件已经存在,将其截断为空文件。
- O_EXCL:与 O_CREAT 一起使用时,如果文件已经存在,则 open() 调用将失败。
- O_SYNC:使文件写操作变为同步写入,即将数据立即写入磁盘。
- O_NONBLOCK:以非阻塞方式打开文件,即使无法立即进行读写操作也不会被阻塞。
当文件为空的时候,文件指针初始化指向0的位置,随着写入,文件指针会落到最后一个字符的后面。当文件描述符被关闭后,重新使用open函数文件指针会指向0。
2.3 lseek 函数
lseek 函数用于移动文件描述符指向文件中的位置。
语法:
#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
fd是文件描述符,通过open函数获取。offset是偏移量,可以是正数、负数或零,用来指定相对于whence的偏移量。whence用于确定offset是相对于文件开始位置、当前位置还是文件末尾位置,有三个可选值:SEEK_SET:偏移量相对于文件开头SEEK_CUR:偏移量相对于当前位置SEEK_END:偏移量相对于文件末尾
返回值:
- 如果成功,
lseek函数返回从文件开头到新的文件位置的偏移量。 - 如果失败,返回值为 -1,并设置全局变量
errno表示出错的原因。
示例:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>int main() {int fd;off_t offset;fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");return 1;}// 设置文件偏移量到文件末尾offset = lseek(fd, 0, SEEK_END);if (offset == -1) {perror("lseek");close(fd);return 1;}printf("File size: %ld bytes\n", offset);close(fd);return 0;
}
这些函数是 C 语言中用于文件操作的基础函数,可以通过它们来进行文件的打开、关闭、读写以及定位操作。
下面是一个操作文件的例子
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main()
{char *buf = "你好啊 世界!"; int fd = open("./file1", O_RDWR); // 尝试以读写模式打开名为 "file1" 的文件if (fd == -1){printf("open file1 failed\n"); // 如果文件打开失败,输出错误消息fd = open("./file1", O_RDWR | O_CREAT, 0600); // 以读写模式和创建标志创建名为 "file1" 的新文件,文件权限为 0600if (fd > 0){printf("create file1 success!\n"); // 如果成功创建文件,输出成功消息}}printf("open success: fd = %d\n", fd); // 打印文件描述符int write_num = write(fd, buf, strlen(buf)); // 向文件写入内容,返回写入的字节数if (write_num != -1){printf("write %d bytes to file\n", write_num); // 打印成功写入的字节数}off_t offset = -21; // 设置偏移量为负数lseek(fd, -21, SEEK_CUR); // 在当前位置偏移 -21 个字节// 读取数据char *temp = (char*)malloc(sizeof(char) * write_num + 1);read(fd,temp,100);printf("%s\n",temp);close(fd); // 关闭文件return 0;
}

参考文章
推荐文章:Linux 文件基本属性
相关文章:
C语言 linux文件操作(一)
文章目录 一、linux文件权限1.1文件描述符1.2文件描述符的范围和默认值1.3打开文件和文件描述符1.4标准文件描述符1.5文件描述符的重定向和关闭1.6I/O 操作1.7使用文件描述符进行进程通信1.8资源限制 二、C语言文件读写2.1open 函数2.2 flags参数详解2.3 lseek 函数 一、linux文…...
007、控制流
先看下本篇学习内容: 通过条件来执行 或 重复执行某些代码 是大部分编程语言的基础组成部分。在Rust中用来控制程序执行流的结构主要就是 if表达式 与 循环表达式。 1. if表达式 if表达式允许我们根据条件执行不同的代码分支。我们提供一个条件,并且做出…...
将学习自动化测试时的医药管理信息系统项目用idea运行
将学习自动化测试时的医药管理信息系统项目用idea运行 背景 学习自动化测试的时候老师的运行方式是把医药管理信息系统项目打包成war包后再放到tomcat的webapp中去运行,于是我想着用idea运行会方便点,现在记录下步骤方便以后查找最开始没有查阅资料&am…...
k8s 的YAML文件详解
一、yaml文件简介 Kubernetes只支持YAML和JSON格式创建资源对象,JSON格式用于接口之间消息的传递,适用于开发;YAML格式用于配置和管理,适用于云平台管理,YAML是一种简洁的非标记性语言。 1)yaml的语法规则&…...
【Pytorch】Pytorch或者CUDA版本不符合问题解决与分析
NVIDIA CUDA Toolkit Release Notes Package installation issues INSTALL PYTORCH 先声毒人:最好资料就是上面三份资料,可以通过官网明确的获取一手信息,你所遇到的99%的问题都可以找到,明确的解决方案,建议最好看…...
『精』CSS 小技巧之BEM规范
『精』CSS 小技巧之BEM规范 文章目录 『精』CSS 小技巧之BEM规范一、什么是BEM?二、BEM要怎么用?三、不用BEM会少个胳膊吗?💊四、Sass与BEM的结合🎈五、块与修饰符应放在一块👿参考资料💘推荐博…...
vue3-12
需求是用户如果登录了,可以访问主页,如果没有登录,则不能访问主页,随后跳转到登录界面,让用户登录 实现思路,在用户登录之前做一个检查,如果登录了,则token是存在的,则放…...
操作系统期末复习
分段存储管理方式 某采用段式存储管理的系统为装入主存的一个作业建立了如下段表: 段号 段长 主存起始地址 0 660 210 1 140 3300 2 100 90 3 580 1237 4 960 1959 (1)计算该作业访问[0,432],[1&am…...
element el-table实现可进行横向拖拽滚动
【问题】表格横向太长,表格横向滚动条位于最底部,需将页面滚动至最底部才可左右拖动表格,用户体验感不好 【需求】基于elment的el-table组件生成的表格,使其可以横向拖拽滚动 【实现】灵感来源于这篇文章【Vue】表格可拖拽滚动&am…...
【兔子王赠书第14期】《YOLO目标检测》涵盖众多目标检测框架,附赠源代码和全书彩图!
文章目录 写在前面YOLO目标检测推荐图书本书特色内容简介作者简介 推荐理由粉丝福利写在后面 写在前面 小伙伴们好久不见吖,本期博主给大家推荐一本关于YOLO目标检测的图书,该书侧重目标检测的基础知识,包含丰富的实践内容,是目标…...
WPF 基础入门(样式)
3.1 一般样式 <Grid Margin"10"><TextBlock Text"Style test" Foreground"Red" FontSize"20"/> </Grid> 3.2内嵌样式 直接在控件上定义样式,如下所示: <Grid Margin"10">…...
Java ArrayList在遍历时删除元素
文章目录 1. Arrays.asList()获取到的ArrayList只能遍历,不能增加或删除元素2. java.util.ArrayList.SubList有实现add()、remove()方法3. 遍历集合时对元素重新赋值、对元素中的属性赋值、删除元素、新增元素3.1 普通for循环3.2 增强for循环3.3 forEach循环3.4 str…...
多模态大模型的前世今生
1 引言 前段时间 ChatGPT 进行了一轮重大更新:多模态上线,能说话,会看图!微软发了一篇长达 166 页的 GPT-4V 测评论文,一时间又带起了一阵多模态的热议,随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作…...
Android studio 花式按键
一、activity_main.xml代码: <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.a…...
使用spring boot实现异常的统一返回
在这个前后端分离的时代,一个 统一的数据格式非常重要。本次我们实现用spring boot实现一下返回给前端数据的统一格式,不再出现服务器500的错误。 新建一个spring boot项目,并导入knife4j的依赖。 写一个controller控制器,用来是…...
2023-12-11 LeetCode每日一题(最小体力消耗路径)
2023-12-11每日一题 一、题目编号 1631. 最小体力消耗路径二、题目链接 点击跳转到题目位置 三、题目描述 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格…...
PID为1的僵尸进程的产生及清理
父进程PID为1的僵尸进程通常是由init系统(在Linux系统中通常是systemd)产生的。这种情况通常发生在以下几种情况: 子进程结束,但其父进程没有正确地调用wait()或waitpid()系统调用来获取子进程的退出状态。在这种情况下࿰…...
043、循环神经网络
之——RNN基础 杂谈 第一个对于序列模型的网络,RNN。 正文 1.潜变量自回归模型 潜变量总结过去的信息,再和当前信息一起结合出新的信息。 2.RNN 循环神经网络将观察作为x,与前层隐变量结合得到输出 其中Whh蕴含了整个模型的时序信息…...
node使用nodemonjs自动启动项目
安装 npm install -g nodemon使用方法 我这里用的是electron项目为例package.json配置 {"name": "my-electron-app","version": "1.0.0","description": "Hello World!","main": "main.js"…...
Ts自封装WebSocket心跳重连
WebSocket是一种在单个TCP连接上进行全双工通信的协议,允许客户端和服务器之间进行双向实时通信。 所谓心跳机制,就是在长时间不使用WebSocket连接的情况下,通过服务器与客户端之间按照一定时间间隔进行少量数据的通信来达到确认连接稳定的手…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
