【linux】基础IO |文件操作符

news2024/11/26 17:00:31

需要掌握:操作文件,本质:进程操作文件。进程和文件的关系
向文件中写入,本质上向硬件中写入->用户·没有权利直接写入->操作系统是硬件的管理者,我们可以通过操作系统往硬件写入->操作系统必须提供系统调用(默认操作系统不相信任何人)
我们使用的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语言为什么支持跨平台性

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 学习之路--工具篇--yum

前面介绍了权限有关的内容&#xff0c;这里继续介绍有关Linux里面常用的工具之一yum 目录 一、简单介绍 <1> 源代码安装 <2>rpm 包安装 <3>yum / apt-get(ubuntu) 安装 二、简单使用 <1>安装包介绍 <2> yum 的基本指令 -- install <…

本地部署的stable diffusion 如何更新controlnet?

stable diffusion 未启动状态 点击“版本管理” 点击“扩展” 找到controlnet&#xff0c;点击右边的“更新”按钮 完成&#xff01;

Linux 动静态库的制作,使用和加载

Linux 动静态库的制作,使用和加载 一.前置说明1.mylib.h2.mylib.c3.mymath.h mymath.c4.如何制作库 二.动静态库的制作1.静态库的制作1.制作2.使用一下静态库,验证是否成功打包 2.动态库的制作1.编译.c源文件文件生成.o目标文件2.打包生成动态库3.编写makefile文件,自动化制作动…

Linux系统中安装一些常用的插件备用

Linux系统中安装一些常用的插件备用 1.安装wget yum -y install wget 2.安装vim yum -y install vim-enhanced 3.更换yum源为国内的阿里云源&#xff08;选择&#xff09; 1、备份CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.…

42 ajax 下载文件未配置 responseType blob 导致的文件异常

前言 这是一个最近的关于文件下载碰到的一个问题 主要的情况是, 基于 xhr 发送请求, 获取下载的文件 然后 之后 xhr 这边拿到 字节序列之后, 封装 blob 来进行下载 然后 最开始我们这边没有配置 responseType 为 blob, arraybuffer, 然后 导致下载出来的 文件大小超过了…

许可型DeFi 项目NEOPIN:在合规的框架下推动DeFi的创新

合规化已成 DeFi 的主流方向 过去的几年里&#xff0c;全球金融市场见证了 DeFi 的快速增长。DeFi 通过提供无需中介的交易和借款等金融服务&#xff0c;为用户带来前所未有的便利。然而&#xff0c;其匿名性和去中心化的特性也为监管和安全带来挑战 —— DeFi项目的透明度不足…

机器学习概论—增强学习

机器学习概论—增强学习 强化学习(Reinforcement Learning, RL)或者说是增强学习,是机器学习的一个领域,旨在使智能体通过与环境的交互学习如何做出决策,它是关于在特定情况下采取适当的行动来最大化奖励。它被各种软件和机器用来寻找在特定情况下应采取的最佳行为或路径…

马上蓝桥杯了,干货总结动态规划专题,祝你考场爆杀(基础篇)猫粮规划 接苹果 魔族密码 最大正方形 最大正方形 2 奶牛比赛

目录 猫粮规划 思路&#xff1a; 接苹果 思路&#xff1a; 魔族密码 思路&#xff1a; 最大正方形 思路&#xff1a; 最大正方形 2 思路&#xff1a; 奶牛比赛 ​编辑 思路&#xff1a; 猫粮规划 思路&#xff1a; 每种食物都有两种状态&#xff0c;记忆化d…

以太网/USB 数据采集卡 24位16通道 labview 256K同步采样

XM7016以太网SUB数据采集卡 XM7016是一款以太网/USB高速数据采集卡&#xff0c;具有16通道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率256ksps. 16通道同步共计4.096Msps、精密前置增益放大、集成IEPE/ICP硬件支持的特点。本产品采用了多个高精度24位ADC单元…

<QT基础(4)>QLabel使用笔记

Label 前面的文章里面把QLabel批量引入ScrollArea作为预览窗口&#xff0c;这篇把图像填充到QLable的PixelMap展示指定图像。 参数设置 设置QLabel的大小格式 QWidget* widget new QWidget; widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); widget->…

31-5 命令执行漏洞 - RCE漏洞利用

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、打开pikachu靶场 二、远程命令执行利用 正常情况下这一关卡就是个ping命令,我们只能输入个 ip 靶场就就会ping 这ip 但是我们可以用管道符拼接来执行其他命令,详细可以看我…

每日一题 --- 快乐数[力扣][Go]

快乐数 题目&#xff1a;202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到…

正弦实时数据库(SinRTDB)的使用(5)-历史数据查询

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

全国产数据采集卡定制,24位八通道以太网数据采集卡 labview 100K采样

XM702是一款以太网型高速数据采集卡&#xff0c;具有8通 道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率100ksps八通 道同步共计800ksps、精密前置增益放大、集成IEPE/ICP硬件 支持的特点。本产品采用了多个高精度24位ADC单元及配合本 公司多年积累开发的前置…

Linux: 检测工具: monit: cpu占用率的一个例子

最近看到monit使用的CPU有时候会突然的增加,通过perf查看,可以看到是下面这个函数调用占用的比较高。 Overhead Comma Shared Object Symbol 29.72% monit [kernel.kallsyms] [k] __d_lookup__d_lookup29.65% d_lookup proc_fill_cache ` proc_readfd_common iterate_dir ksy…

(2024,嵌套标记化,区域编码器,上下文编码器,Transformer-XL,Mamba)xT:大图像中更大上下文的嵌套标记化

xT: Nested Tokenization for Larger Context in Large Images 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 背景 3.1. 长上下文模型作为上下文编码器 3.2. 线性注意机…

2024年妈妈杯数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

如何在 Oracle 中使用 CREATE SEQUENCE 语句

在本文中&#xff0c;我们将讨论 Oracle CREATE SEQUENCE 语句&#xff0c;其主要目的是提供一种可靠的方法来生成唯一且连续的数值&#xff0c;通常用于数据库表中的主键字段。此功能对于维护数据完整性和效率、确保不同记录之间的标识符有序分配尤其重要。从本质上讲&#xf…

数据库的横表和竖表

先来看个图: 定义如下&#xff1a; 横表&#xff1a;在一行数据中包含了所有的属性&#xff0c;一行就代表了一个完整的实体 竖表&#xff1a;在一行中只存储一个实体的一个属性&#xff0c;多个行组合在一起才组成一个完整的属性适用场景&#xff1a; 横表&#xff1a;对查…

从零玩转CanMV-K230(2)-开发环境搭建

文章目录 前言一、编译环境搭建二、镜像烧写总结 前言 本章介绍如何搭建CanMV-K230开发环境&#xff0c;基于LinuxRT-smart双系统开发 一、编译环境搭建 我是用的vmware虚拟机&#xff1a;ubuntu 20.04&#xff0c;搭建环境如下&#xff1a; 直接下载压缩包&#xff0c;下载…