【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语言为什么支持跨平台性

支持系统调用,也可以使用语言提供文件方法系统不同,可能导致系统调用的接口可能不一样,导致代码不具有跨平台性,所以所有的语言都想具有跨平台性,所以所有的语言要对平台的系统调用进行封装,不同语言封装,文件接口就有差别了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/499461.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript邂逅

文章目录 Javascript内容邂逅JavaScript前端的三大核心计算机语言认识编程语言常见的编程语言编程语言的发展历史–机器语言阶段一: 机器语言 编程语言的发展历史–汇编语言阶段二:汇编语言 汇编语言的发展历史–高级语言阶段三:高级语言 机器语言和高级语言 认识JavaScriptJav…

大数据做「AI大模型」数据清洗调优基础篇

关于本文 近期一直在协助做AI大模型数据清洗调优的工作&#xff0c;主要就是使用大数据计算引擎Spark做一些原始数据的清洗工作&#xff0c;整体数据量大约6PB-8PB之间&#xff0c;那么对于整个大数据量的处理性能将是一个重大的挑战&#xff0c;关于具体的调优参数配置项暂时不…

面向对象特征一:封装性

9.1 为什么需要封装&#xff1f; 我要用洗衣机&#xff0c;只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内部的结构吗&#xff1f;有必要 碰电动机吗&#xff1f; 我要开车&#xff0c;我不需要懂离合、油门、制动等原理和维修也可以驾驶。 客观世界里每一个事物…

python图像界面改左上角窗口的的icon图标

目录 问题描述 解决办法 展示成功 结语 问题描述 Traceback (most recent call last): File "d:\桌面\python项目\py_boomer-master\py_boomer-master\微信公众号.py", line 20, in <module> window.iconbitmap(D:/桌面/python项目/3.png) # Correc…

主流电商平台api接口实时数据返回

主流电商平台的API接口可以实时返回一些常用的数据&#xff0c;包括但不限于以下几种&#xff1a; 商品数据&#xff1a;可以获取平台上的商品信息&#xff0c;包括商品名称、价格、库存等。 订单数据&#xff1a;可以获取用户下单的订单信息&#xff0c;包括订单号、下单时间…

快速识别PLC通讯中的两种主要应用方式

在工业自动化领域&#xff0c;PLC扮演着至关重要的角色。然而&#xff0c;许多人在初次接触PLC通讯时&#xff0c;常因其复杂性而感到困扰。事实上&#xff0c;PLC的通讯并不如人们想象中的那么神秘&#xff0c;它主要只有两种类型&#xff1a;一种是需要编写代码的通讯方式&am…

python coding with ChatGPT 专题1 | 树的直径

文章目录 定义题目特点 树的表示字典存储邻接表TreeNode类 深度优先 &#xff08;两次DFS法&#xff09;动态规划 &#xff08;树形DP&#xff09;优势 相似题目参考资料 定义 树上任意两节点之间最长的简单路径即为树的「直径」。 题目 给定一棵树&#xff0c;求出这棵树的…

vue3+ts | axios 二次封装

安装 pnpm i axios axios 二次封装 // 实用性工具文件 放于 utils文件中 // 对axios函数库进行二次封装&#xff1f; // 二次封装的目的&#xff1f;利用axios请求、响应拦截器 import axios from axios// axios.create 创建一个axios实例&#xff1a;可以设置基础路径&a…

探索数据结构:链式队与循环队列的模拟、实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 队列的定义 队列&#xff08;queue&#xff09;是一种只允许在一端进…

原来这就是线程安全(一)

TOC 一:什么是线程不安全?? 先看一段代码: public class Demo1 {public static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1new Thread(()->{for (int i 0; i < 50000; i) {count;}});Thread t2new Thread(()-&g…

Linux-进程控制

&#x1f30e;进程控制【上】 文章目录&#xff1a; 进程控制 为什么要有地址空间和页表 程序的内存       程序申请内存使用问题 写时拷贝与缺页中断 父子进程代码共享       为什么需要写时拷贝       页表的权限位       缺页中断 退出码和错误码…

P3369 【模板】普通平衡树(splay 算法)

题目描述 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a; 插入一个数 x。删除一个数 x&#xff08;若有多个相同的数&#xff0c;应只删除一个&#xff09;。定义排名为比当前数小的数的…

Pytorch从零开始实战22

Pytorch从零开始实战——CycleGAN实战 本系列来源于365天深度学习训练营 原作者K同学 内容介绍 CycleGAN是一种无监督图像到图像转换模型&#xff0c;它的一个重要应用领域是域迁移&#xff0c;比如可以把一张普通的风景照变化成梵高化作&#xff0c;或者将游戏画面变化成真…

2024软件设计师备考讲义——UML(统一建模语言)

UML的概念 用例图的概念 包含 <<include>>扩展<<exted>>泛化 用例图&#xff08;也可称用例建模&#xff09;描述的是外部执行者&#xff08;Actor&#xff09;所理解的系统功能。用例图用于需求分析阶段&#xff0c;它的建立是系统开发者和用户反复…

4G/5G防爆布控球

#防爆布控球 #远程实时监控 #移动应急指挥 #高清图像采集 #防爆安全认证 4G/5G防爆布控球 M130-EX防爆布控球是针对石化装置、石油平台、燃气、化工、制药、煤炭、冶炼、船舶制造、纺织等易燃易爆环境及危险场所而开发设计的防爆智能一体化电气设备。 产品型号&#xff1a;M13…

Antd Vue3 使用 Anchor 锚点组件记录

项目场景 客户要求做一个表单页面&#xff0c;表单数据分为三步&#xff0c;每一步骤是一个单独的 Vue 组件&#xff0c;表单上方需要使用锚点组件实现锚点定位到每一步的功能。 代码总览 <template><div class"guided-form-content-wrapper"><!-- …

CKS之Kubernetes审计日志

目录 概述 审计事件阶段 审计日志级别 None Metadata Request RequestResponse 审计日志的使用 步骤1&#xff1a;配置审计策略文件 步骤2&#xff1a;配置API Server 步骤3&#xff1a;配置日志存储 注意事项 审计策略与规则 审计日志样例 使用场景 概述 Kube…

一、JAVA集成海康SDK

JAVA集成海康SDK 文章目录 JAVA集成海康SDK前言一、项目依赖 jar1. examples.jar2. 项目依赖 jna.jar,可以通过 maven依赖到。二、集成SDK1.HcNetSdkUtil 海康 SDK封装类2.HCNetSDK3.Linux系统集成SDK三、总结前言 提示:首先去海康官网下载 https://open.hikvision.com/dow…

stable diffusion如何下载模型?

文件夹里面有14个模型&#xff0c;把这些模型复制到SD文件夹里 具体位置:SD文件>models>ControlNet

【C/C++】从零开始认识C++历程-启航篇

文章目录 &#x1f4dd;前言&#x1f320; 什么是C&#xff1f;&#x1f309;C的发展史 &#x1f320;C的重要性&#x1f309;语言的使用广泛度 &#x1f320;在工作领域&#x1f309; 岗位需求 &#x1f320;相关笔试题&#x1f309; 公司怎样面试C &#x1f6a9;总结 &#x…