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

【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 |文件操作符

需要掌握&#xff1a;操作文件&#xff0c;本质&#xff1a;进程操作文件。进程和文件的关系 向文件中写入&#xff0c;本质上向硬件中写入->用户没有权利直接写入->操作系统是硬件的管理者&#xff0c;我们可以通过操作系统往硬件写入->操作系统必须提供系统调用&…...

探索 2024 年 Web 开发最佳前端框架

前端框架通过简化和结构化的网站开发过程改变了 Web 开发人员设计和实现用户界面的方法。随着 Web 应用程序变得越来越复杂&#xff0c;交互和动画功能越来越多&#xff0c;这是开发前端框架的初衷之一。 在网络的早期&#xff0c;网页相当简单。它们主要以静态 HTML 为特色&a…...

解决: MAC ERROR [internal] load metadata for docker.io/library/openjdk:17

错误信息&#xff1a; ERROR [internal] load metadata for docker.io/library/openjdk:17 ERROR: failed to solve: openjdk:17: error getting credentials - err: exit status 1, out: 解决方法&#xff1a; running this command rm ~/.docker/config.json before …...

View事件分发

MotionEvent 1.简介 MotionEvent 是Android系统中一个非常重要的类&#xff0c;它代表了屏幕上发生的触摸事件。当用户在屏幕上触摸、滑动或者长按时&#xff0c;都会生成一个MotionEvent对象&#xff0c;这个对象包含了触摸动作的各种信息。 2.事件类型 ACTION_DOWN&#x…...

监听页面的使用时间

如果是比较新的vue架构&#xff08;推荐&#xff0c;参考若依&#xff09; 监听create&#xff08;&#xff09;和destory&#xff08;&#xff09;两个函数&#xff0c;写通用的js调用函数&#xff0c;在路由守卫的时候使用&#xff0c;就可以获取到每个页面停留时间 如果是比…...

【 yolo红外微小无人机-直升机-飞机-飞鸟目标检测】

yolo无人机-直升机-飞机-飞鸟目标检测 1. 小型旋翼无人机目标检测2. yolo红外微小无人机-直升机-飞机-飞鸟目标检测3. yolo细分类型飞机-鸟类-无人机检测4. yolo红外大尺度无人机检测5. 小型固定翼无人机检测6. 大型固定翼无人机检测7. yolo航空俯视场景下机场飞机检测 1. 小型…...

Redis与数据库的一致性

Redis与数据库的数据一致性 在使用Redis作为应用缓存来提高数据的读性能时&#xff0c;经常会遇到Redis与数据库的数据一致性问题。简单来说&#xff0c;就是同一份数据同时存在于Redis和数据库&#xff0c;如何在数据更新的时候&#xff0c;保证两边数据的一致性。首先&#…...

使用maxwell实时同步mysql数据到kafka

一、软件环境&#xff1a; 操作系统&#xff1a;CentOS release 6.5 (Final) java版本: jdk1.8 zookeeper版本: zookeeper-3.4.11 kafka 版本: kafka_2.11-1.1.0.tgz maxwell版本&#xff1a;maxwell-1.16.0.tar.gz 注意 &#xff1a; 关闭所有机器的防火墙&#xff0c;同时注意…...

知识图谱与大数据:区别、联系与应用

目录 前言1 知识图谱1.1 定义1.2 特点1.3 应用 2 大数据2.1 定义2.2 应用 3. 区别与联系3.1 区别3.2 联系 结语 前言 在当今信息爆炸的时代&#xff0c;数据成为了我们生活和工作中不可或缺的资源。知识图谱和大数据是两个关键概念&#xff0c;它们在人工智能、数据科学和信息…...

Nagios工具

一 nagios 相关概念 Nagios 是一款开源的免费网络监视工具&#xff0c;能有效监控 Windows、Linux 和 Unix 的主机状态&#xff0c;交换机路由器等网络设置&#xff0c;打印机等。在系统或服务状态异常时发出邮件或短信报警第 一时间通知网站运维人员&#xff0c;在状态恢复后…...

微信小程序全局数据共享

文章目录 安装MobX相关的包根目录创建store文件夹&#xff0c;添加store.js文件绑定到页面中绑定到组件 mobx-miniprogram和mobx-miniprogram-bindings实现全局数据共享 mobx-miniprogram用来创建Store实例对象 mobx-miniprogram-bindings用来把Store中的共享数据或方法&…...

算法训练营第24天|回溯算法理论基础 LeetCode 77.组合

终于把二叉树做完了&#xff01;开始新的篇章&#xff0c;回溯&#xff01; 回溯算法理论基础 回溯算法题目分类&#xff1a; 1.组合 2.分割 3.子集 4.排列 5.棋盘问题 什么是回溯&#xff1f; 回溯叫做回溯搜索法&#xff0c;是一种搜索方式。回溯是递归的副产品&…...

pip永久修改镜像地址

修改命令&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ 效果&#xff1a; 会在C:\Users\PC(用户名)\AppData\Roaming\pip目录下新增或修改文件pip.ini 文件内容&#xff1a; [global] index-url https://pypi.tuna.tsinghua.e…...

RK3588平台开发系列讲解(硬件篇-功能外设2)

USB2.0/USB3.0 电路 RK3588 芯片内置两个USB3.0 OTG控制器&#xff08;内嵌2个USB2.0 OTG&#xff0c;下图绿色处&#xff09;&#xff0c;1个USB3.0 HOST 控制器&#xff0c;2个USB2.0 HOST控制器。 这些控制器与PHY的内部复用图如下&#xff1a; USB3.0 OTG0 控制器支持SS/H…...

SpringBoot学习记录

SpringBoot是用于加速Spring开发的。 我们先来看看如何使用SpringBoot来创建一个基于Web的程序&#xff0c;可以发现相较于SpringMVC其有巨大改变。 3.开发控制器类 GetMapping("/{id}")public String getById(PathVariable Integer id){System.out.println("…...

财富池指标--通达信顾比均线实战指标免费源码

顾比均线是由两组均线构成&#xff0c;短期组为3、5、8、10、12、15。长期组为&#xff1a;30、35、40、45、50、60。顾比均线由澳大利亚的投资家戴若-顾比先生发明&#xff0c;因此叫顾比线。 顾比均线可以广泛运用于股票、期货和外汇交易中&#xff0c;只要是能运用K线图的投…...

AJAX(一):初识AJAX、http协议、配置环境、发送AJAX请求、请求时的问题

一、什么是AJAX 1.AJAX 就是异步的JS和XML。通过AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式。 2.XML 可扩展标记语言。XML被设计用来传输和…...

idea常用的快捷键总结:

idea常用的快捷键总结&#xff1a; Ctrl相关的&#xff1a; Ctrl F 在当前文件进行文本查找 &#xff08;必备&#xff09; Ctrl R 在当前文件进行文本替换 &#xff08;必备&#xff09; Ctrl Z 撤销 &#xff08;必备&#xff09; Ctrl Y 删除光标所在行 或 删除选中的…...

LeetCode 热题 100 题解(一):哈希部分

《LeetCode热题 100》 经过了两个多月&#xff0c;终于刷完了代码随想录的题目&#xff0c;现在准备开始挑战热题一百了&#xff0c;接下来我会将自己的题解以博客的形式同步发到力扣和 c 站&#xff0c;希望在接下来的征程中与大家共勉&#xff01; 题组一&#xff1a;哈希 题…...

C语言 | qsort()函数使用

目录&#xff1a; 1.qsort介绍 2.使⽤qsort函数 排序 整型数据 3.使⽤qsort函数 排序 结构体数据 4. qsort函数的模拟实现冒泡排序 qsort()函数 是一个 C语言编译器函数库自带的排序函数&#xff0c; 它可以对指定数组&#xff08;包括字符串&#xff0c;二维数组&#x…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...