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连接的情况下,通过服务器与客户端之间按照一定时间间隔进行少量数据的通信来达到确认连接稳定的手…...

【unity学习笔记】捏人+眨眼效果+口型效果
一、vriod捏人 1.在vroidstudio软件中捏人 2.导出模型(.vrm) 二、vrid导入unity的插件 1.在Git上搜索、打开univrm。 2.找到release页面找到合适的插件版本。(VRM-0.116.0_0f6c) 3.将univrm导入到工程中(assets)。 三…...

动态规划 | 最长公共子序列问题
文章目录 最长公共子序列题目描述问题分析程序代码复杂度分析 最短编辑距离题目描述问题分析程序代码复杂度分析 编辑距离题目描述输入格式输出格式 问题分析程序代码 最长公共子序列 题目描述 原题链接 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共…...

RuntimeError: The NVIDIA driver on your system is too old.
【报错】使用 AutoDL 复现实验时遇到 RuntimeError: The NVIDIA driver on your system is too old (found version 11070). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternativ…...

Java开发过程中的幂等性问题
幂等性问题: 1. 有时我们在填写某些 form表单 时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。 2. 我们在项目中为了解决 接口超时 问题,通常会引入了 重试机制 。第一次请求接口超时了…...

基于Docker的软件环境部署脚本,持续更新~
使用时CtrlF搜索你想要的环境,如果没有你想要的环境,可以评论留言,会尽力补充。 本文提供的部署脚本默认参数仅适合开发测试,请根据实际情况调节参数。 数据库 MySQL version: 3.9 services:mysql:image: mysql:8.0.35container…...

C#上位机与欧姆龙PLC的通信08----开发自己的通讯库读写数据
1、介绍 前面已经完成了7项工作: C#上位机与欧姆龙PLC的通信01----项目背景-CSDN博客 C#上位机与欧姆龙PLC的通信02----搭建仿真环境-CSDN博客 C#上位机与欧姆龙PLC的通信03----创建项目工程-CSDN博客 C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区 C#上…...

【Redis技术专区】「原理分析」探讨Redis6.0为何需要启用多线程
探讨Redis 6.0为何需要启用多线程 背景介绍开启多线程多线程的CPU核心配置IO多线程模式单线程处理方式多线程处理方式 为什么要开启多线程?充分利用多核CPU提高网络I/O效率响应现代应用需求 多线程实现启用多线程 最后总结 背景介绍 在Redis 6.0版本中,…...

simulink代码生成(六)——多级中断的配置
假如系统中存在多个中断,需要合理的配置中断的优先级与中断向量表;在代码生成中,要与中断向量表对应;中断相关的知识参照博客: DSP28335学习——中断向量表的初始化_中断向量表什么时候初始化-CSDN博客 F28335中断系…...

【Minikube Prometheus】基于Prometheus Grafana监控由Minikube创建的K8S集群
文章目录 1. 系统信息参数说明2. Docker安装3. minikube安装4. kubectl安装5. Helm安装6. 启动Kubernetes集群v1.28.37. 使用helm安装Prometheus8. 使用helm安装Grafana9. Grafana的Dashboard设定10. 设定Prometheus数据源11. 导入Kubernetes Dashboard12. 实验过程中的常见问题…...

无需翻墙|Stable Diffusion WebUI 安装|AI绘画
前言 最近终于有机会从围墙里往外看,了解到外面的世界已经有了天翻地覆的变化,感叹万千,笔者在本地mac,windows,linux,docker部署了不下20遍后,整理出来的linux极简避坑安装方案,供…...