【linux】基础IO |文件操作符
需要掌握:操作文件,本质:进程操作文件。进程和文件的关系
向文件中写入,本质上向硬件中写入->用户·没有权利直接写入->操作系统是硬件的管理者,我们可以通过操作系统往硬件写入->操作系统必须提供系统调用(默认操作系统不相信任何人)
我们使用的fopen/fwrite/fread/fprintf/scanf/printf/cin/cout/实际上都是对系统调用的接口的封装.
系统调用函数open
头文件
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>
open函数
int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);
第一个open函数的第一个参数是文件名,第二个参数是打开方式,
其中我们要了解的打开方式有
O_WRONLY//只读方式O_CREAT//没有该文件就创建O_APPEND//追加O_TRUNC//覆盖式写入
因为要用到close函数关闭文件,
close函数
头文件
#include <unistd.h>
int close(int fd);
有一个疑问,为什么他的 参数是int类型的,因为对应的打开方式可以是int 32中任何一位为1并且和其他区分开来,然后需要多个功能的话,按位或就可以,这是操作系统调用接口的常见方法
1.只写和没有该文件就创建
1 #include<stdio.h>2 #include <sys/types.h>3 #include <sys/stat.h>4 #include <fcntl.h>5 #include <unistd.h>6 int main()7 {8 int fd=open("log.txt", O_WRONLY| O_CREAT|O_APPEND); 9 if(fd<0)10 {perror("open");11 return 1;}12 close(fd);13 return 0;14 15 }
O_WRONLY| O_CREAT

我们发现当前目录下没有我们要的“log.txt”

当我们运行这个程序后,发现出现了该文件
为了测试追加功能,我们通过vim往log.txt里面写入点东西

修改打开方式为只写和追加,所以修改参数2为
O_WRONLY|O_APPEND
但是我们发现log.txt这个文件的权限怎么不对呀,这里是因为如过用第一个open函数的话,就必须是已经创建好的文件,就已经有了权限,要不然就只能用第二个open函数,第二个open函数的第三个参数就是要设置的掩码值,所以我们使用第二个open函数
#include<stdio.h>2 #include <sys/types.h>3 #include <sys/stat.h>4 #include <fcntl.h>5 #include <unistd.h>6 int main()7 {8 int fd=open("loog.txt", O_WRONLY| O_CREAT|O_APPEND,0666); //设置log.txt文件掩码为0666 9 if(fd<0)10 {perror("open");11 return 1;}12 close(fd);13 return 0;14 15 }

但是这里的权限是664呢,因为我们可以通过unmask来查看对应的默认掩码

我们可以将默认掩码在函数内设置为0

这段代码修改了掩码为0,并且修改其文件名

此时我们就可以修改我们的loog.txt文本文件了

使用打开方式
O_WRONLY|O_APPEND
此时我们就用到了write函数,

头文件
#include <unistd.h>
函数
ssize_t write(int fd, const void *buf, size_t count);
函数第一个参数是文件描述符,对应你打开的文件,待会在讲这个fd,文件描述符,
第二个参数是你要写入的字符串,第三个参数是要写入字符串的大小
1 #include<stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 #include <unistd.h> 6 int main() 7 { 8 umask(0); 9 10 int fd=open("looog.txt", O_WRONLY|O_APPEND,0666); 11 12 if(fd<0) 13 {perror("open"); 14 return 1;} 15 char buf[]="hello world"; 16 write(fd, buf,sizeof(buf)); 17 close(fd); 18 return 0; 19 20 }

覆盖式写入
第二个参数修改为:
O_WRONLY| O_TRUNC
1 #include<stdio.h>2 #include <sys/types.h>3 #include <sys/stat.h>4 #include <fcntl.h>5 #include <unistd.h>6 int main()7 {8 umask(0);9 10 int fd=open("looog.txt", O_WRONLY| O_TRUNC,0666); 11 12 if(fd<0) 13 {perror("open"); 14 return 1;} 15 char buf[]="hello world"; 16 write(fd, buf,sizeof(buf)); 17 close(fd); 18 return 0; 19 20 }

除了上面的方法给文件写入数据,我们还可以通过echo写入数据


我们发现是覆盖式写入


我们发现是追加式写入
文件操作符
我们刚才使用了open函数,和write函数,里面open函数返回的是一个fd,write的第一个参数是fd,这就是我们要提到的文件操作符
为了讲清文件操作符这个概念
我们可以先来说说操作系统是如何进行文件的写入和读呢?

在我们启动进程时,默认操作系统已经帮我们打开
标准输入流:0(对应的文件标识符)—键盘
标准输出流:1(对应的文件标识符)—显示器
标准错误流:2(对应的文件标识符)—显示器
我们可以把这些外设也当成文件(linux一切皆文件)
如果是文件,当我们使用的时候,也会给他创建pcb结构来管理外设

在操作系统内,系统在访问文件的时候,只认文件描述符fd
open函数在干什么呢??
1.创建file对应的pcb管理文件属性
2.开辟文件缓冲区的空间,将文件数据加载到文件缓冲区去(延后)
3.查进程文件的文件描述表
4.将对应文件的地址填入到指针数组中去
5.返回下标
文件操作符的本质是什么呢?
内核的进程:文件映射关系的数组下标
c语言如何通过FILE*访问文件呢?
1 #include<stdio.h>2 int main()3 {4 FILE* fp=fopen("hot.txt","w");5 if(NULL==fp)6 {7 perror("fopen error");8 return 1;9 10 11 12 }13 fprintf(fp,"hello world");14 fclose(fp);15 return 0; 16 }
实际上FILE是一个c语言的一个结构体类型,里面封装了文件标识符fd
gcc -E file.c -o file.i//预处理完就停下,头文件展开
在stdio.h头文件里面

1 #include<stdio.h>2 int main()3 {4 printf("输入流:%d\n",stdin->_fileno);//对应结构体里面封装了文件的文件标识符5 printf("输出流:%d\n",stdout->_fileno);6 printf("错误流:%d\n",stderr->_fileno); 7 8 9 10 11 12 13 14 15 }
接着打开的文件的文件标识符就从3开始往后
终端也是文件

我们复制ssh的渠道,左边为另一个终端

1 #include<stdio.h>2 #include <unistd.h>3 #include <sys/types.h>4 #include <sys/types.h>5 #include <sys/stat.h>6 #include <fcntl.h>7 8 int main()9 {10 while(1)11 {12 printf("pid:%d\n",getpid());13 14 15 16 17 18 } 19 //int fd=open("/dev/pts/0",O_WRONLY| O_TRUNC,0666);20 //if(fd<0) 21 // {perror("error");} 22 //char arr[]="hello wokao"; 23 //write(fd,arr,sizeof(arr)); 24 //close(fd); 25 26 }



/proc/目录下存在着正在运行的进程的pid




1 #include<stdio.h>2 #include <unistd.h>3 #include <sys/types.h>4 #include <sys/types.h>5 #include <sys/stat.h>6 #include <fcntl.h>7 8 int main()9 {int fd=open("/dev/pts/0",O_WRONLY| O_TRUNC,0666);10 if(fd<0)11 {perror("error");}12 char arr[]="hello wokao";13 write(fd,arr,sizeof(arr));14 close(fd);15 16 }


把终端当文件写入
c语言为什么支持跨平台性
支持系统调用,也可以使用语言提供文件方法系统不同,可能导致系统调用的接口可能不一样,导致代码不具有跨平台性,所以所有的语言都想具有跨平台性,所以所有的语言要对平台的系统调用进行封装,不同语言封装,文件接口就有差别了

相关文章:
【linux】基础IO |文件操作符
需要掌握:操作文件,本质:进程操作文件。进程和文件的关系 向文件中写入,本质上向硬件中写入->用户没有权利直接写入->操作系统是硬件的管理者,我们可以通过操作系统往硬件写入->操作系统必须提供系统调用&…...
探索 2024 年 Web 开发最佳前端框架
前端框架通过简化和结构化的网站开发过程改变了 Web 开发人员设计和实现用户界面的方法。随着 Web 应用程序变得越来越复杂,交互和动画功能越来越多,这是开发前端框架的初衷之一。 在网络的早期,网页相当简单。它们主要以静态 HTML 为特色&a…...
解决: MAC ERROR [internal] load metadata for docker.io/library/openjdk:17
错误信息: ERROR [internal] load metadata for docker.io/library/openjdk:17 ERROR: failed to solve: openjdk:17: error getting credentials - err: exit status 1, out: 解决方法: running this command rm ~/.docker/config.json before …...
View事件分发
MotionEvent 1.简介 MotionEvent 是Android系统中一个非常重要的类,它代表了屏幕上发生的触摸事件。当用户在屏幕上触摸、滑动或者长按时,都会生成一个MotionEvent对象,这个对象包含了触摸动作的各种信息。 2.事件类型 ACTION_DOWN&#x…...
监听页面的使用时间
如果是比较新的vue架构(推荐,参考若依) 监听create()和destory()两个函数,写通用的js调用函数,在路由守卫的时候使用,就可以获取到每个页面停留时间 如果是比…...
【 yolo红外微小无人机-直升机-飞机-飞鸟目标检测】
yolo无人机-直升机-飞机-飞鸟目标检测 1. 小型旋翼无人机目标检测2. yolo红外微小无人机-直升机-飞机-飞鸟目标检测3. yolo细分类型飞机-鸟类-无人机检测4. yolo红外大尺度无人机检测5. 小型固定翼无人机检测6. 大型固定翼无人机检测7. yolo航空俯视场景下机场飞机检测 1. 小型…...
Redis与数据库的一致性
Redis与数据库的数据一致性 在使用Redis作为应用缓存来提高数据的读性能时,经常会遇到Redis与数据库的数据一致性问题。简单来说,就是同一份数据同时存在于Redis和数据库,如何在数据更新的时候,保证两边数据的一致性。首先&#…...
使用maxwell实时同步mysql数据到kafka
一、软件环境: 操作系统:CentOS release 6.5 (Final) java版本: jdk1.8 zookeeper版本: zookeeper-3.4.11 kafka 版本: kafka_2.11-1.1.0.tgz maxwell版本:maxwell-1.16.0.tar.gz 注意 : 关闭所有机器的防火墙,同时注意…...
知识图谱与大数据:区别、联系与应用
目录 前言1 知识图谱1.1 定义1.2 特点1.3 应用 2 大数据2.1 定义2.2 应用 3. 区别与联系3.1 区别3.2 联系 结语 前言 在当今信息爆炸的时代,数据成为了我们生活和工作中不可或缺的资源。知识图谱和大数据是两个关键概念,它们在人工智能、数据科学和信息…...
Nagios工具
一 nagios 相关概念 Nagios 是一款开源的免费网络监视工具,能有效监控 Windows、Linux 和 Unix 的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第 一时间通知网站运维人员,在状态恢复后…...
微信小程序全局数据共享
文章目录 安装MobX相关的包根目录创建store文件夹,添加store.js文件绑定到页面中绑定到组件 mobx-miniprogram和mobx-miniprogram-bindings实现全局数据共享 mobx-miniprogram用来创建Store实例对象 mobx-miniprogram-bindings用来把Store中的共享数据或方法&…...
算法训练营第24天|回溯算法理论基础 LeetCode 77.组合
终于把二叉树做完了!开始新的篇章,回溯! 回溯算法理论基础 回溯算法题目分类: 1.组合 2.分割 3.子集 4.排列 5.棋盘问题 什么是回溯? 回溯叫做回溯搜索法,是一种搜索方式。回溯是递归的副产品&…...
pip永久修改镜像地址
修改命令: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ 效果: 会在C:\Users\PC(用户名)\AppData\Roaming\pip目录下新增或修改文件pip.ini 文件内容: [global] index-url https://pypi.tuna.tsinghua.e…...
RK3588平台开发系列讲解(硬件篇-功能外设2)
USB2.0/USB3.0 电路 RK3588 芯片内置两个USB3.0 OTG控制器(内嵌2个USB2.0 OTG,下图绿色处),1个USB3.0 HOST 控制器,2个USB2.0 HOST控制器。 这些控制器与PHY的内部复用图如下: USB3.0 OTG0 控制器支持SS/H…...
SpringBoot学习记录
SpringBoot是用于加速Spring开发的。 我们先来看看如何使用SpringBoot来创建一个基于Web的程序,可以发现相较于SpringMVC其有巨大改变。 3.开发控制器类 GetMapping("/{id}")public String getById(PathVariable Integer id){System.out.println("…...
财富池指标--通达信顾比均线实战指标免费源码
顾比均线是由两组均线构成,短期组为3、5、8、10、12、15。长期组为:30、35、40、45、50、60。顾比均线由澳大利亚的投资家戴若-顾比先生发明,因此叫顾比线。 顾比均线可以广泛运用于股票、期货和外汇交易中,只要是能运用K线图的投…...
AJAX(一):初识AJAX、http协议、配置环境、发送AJAX请求、请求时的问题
一、什么是AJAX 1.AJAX 就是异步的JS和XML。通过AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。 2.XML 可扩展标记语言。XML被设计用来传输和…...
idea常用的快捷键总结:
idea常用的快捷键总结: Ctrl相关的: Ctrl F 在当前文件进行文本查找 (必备) Ctrl R 在当前文件进行文本替换 (必备) Ctrl Z 撤销 (必备) Ctrl Y 删除光标所在行 或 删除选中的…...
LeetCode 热题 100 题解(一):哈希部分
《LeetCode热题 100》 经过了两个多月,终于刷完了代码随想录的题目,现在准备开始挑战热题一百了,接下来我会将自己的题解以博客的形式同步发到力扣和 c 站,希望在接下来的征程中与大家共勉! 题组一:哈希 题…...
C语言 | qsort()函数使用
目录: 1.qsort介绍 2.使⽤qsort函数 排序 整型数据 3.使⽤qsort函数 排序 结构体数据 4. qsort函数的模拟实现冒泡排序 qsort()函数 是一个 C语言编译器函数库自带的排序函数, 它可以对指定数组(包括字符串,二维数组&#x…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
