基础IO认识

news2024/11/24 1:06:11

回顾文件

我们之前认识文件只是在语言程度上理解,但是我们理解的不够彻底,要想真正理解文件要在os上理解。

简单代码认识

                                                                                                                              
  1 #include<stdio.h>
  2 int main(){
  3     FILE* fp=fopen("log.txt","w");
  4     if(fp==NULL){
  5         perror("fopen");                                                                                                                                   
  6         return -1;
  7     }
  8     fclose(fp);
  9     return 0;
 10 }

 以w权限执行时,如果文件不存在就在当前路径下创建新文件。

 我们在进行文件操作时,前提得是程序代码跑起来。
文件的打开与关闭都是cpu在执行我们的代码时执行到这一步才打开与关闭

文件=属性+内容

 那么如何向文件中写呢?
介绍函数:fprintf

 以w权限时,默认打开文件的时候就会首先把目标文件清空。

文件打开方式

 提炼对文件的理解

1. 打开文件本质就是进程打开文件(程序执行起来就是一个进程)。
task_struct---->struct xxx
struct xxx就是os内部对应的描述文件属性的结构体(类似pcb)
2. 文件没有被打开的时候在哪里?在磁盘(没有就创建)

3. 进程能打开多个文件么(fopen)?可以

4. 系统中可不可以存在很多进程?当然可以,windows就有很多进程那么linux自然也有

5. 很多情况下,在os内部一定存在大量的被打开文件。那么os要不要把这些被打开的文件进行管理呢?

 理解文件

a. 操作文件,本质是进程操作文件。进程和文件的关系

b. 文件刚开始是在磁盘上(外设设备,硬件),那么向文件中写入就是向硬件中写入,但是用户没权利直接向硬件中写入因为硬件的管理者是os,所以只能由os写入,所以os必须给我们提供系统调用接口,比如scanf/printf/fopen/fwrite/fread/fprintf/cin/cout(库函数)等我们用的c/c++/...都是对系统调用接口的封装(不同语言访问文件的方式有些不同)。即访问文件我们也可以用系统调用(open/write/close)

先用和认识系统调用的文件操作 

标记位传参的理解

open:

close:

 #include <unistd.h>

 int close(int fd);//fd就是open返回的整数
注意man 2 close/open/write用2号页表查看系统调用接口

 我们如果想按照我们预定的权限的话,加umask(0),这样程序会用我们自己的umask。但是自己设置一个umask系统也有一个umask那么程序执行谁的呢?就近原则,有自己的用自己的,没有的话用系统的

 标志位flags是int类型32位比特位,那么可以用比特位来进行标志位的传递,这是os设计很多系统调用接口的常见方法。那么可以flags标志位传递理解为位图。

但是O_WRONLY | O_CREAT为什么大写呢?平常c/c++等大写的是宏,那么可以类推他俩也是宏

模仿位图传参

 写入操作

 

  1 #include<stdio.h>
  2 #include<unistd.h>                                                        
  3 #include<string.h>
  4 #include<sys/types.h>
  5 #include<sys/stat.h>
  6 #include<fcntl.h>
  7 int main(){
  8     umask(0);
  9     int fp=open("log.txt",O_WRONLY|O_CREAT,0666);
 10     if(fp<0){
 11         perror("open");
 12         return 1;
 13     }
 14     const char* ch="hello linux!";
 15     write(fp,ch,strlen(ch));
 16     return 0;
 17 
 18 }

 fd: 后面讲, msg:缓冲区首地址, strlen: 本次读取,期望写入多少个字节的数据。 返回值:实际写了多少字节数据

注意strlen在写的时候不需要再+1,\0是c语言的规定跟文件没关系,我们要把有效信息写入。

 当然如果想截断清空的话可以加O_TRUNC:

 当然也可以追加O_APPEND:

 open返回值

 由代码运行结果可知open函数返回值从3开始计数。那么0,1,2是什么呢?
0:标准输入 键盘
1:标准输出 显示器
2:标准错误 显示器
当然你也可以直接write(1,ch,strlen(ch));向显示器输出

 通关理解

 而现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来 描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件 描述符,就可以找到对应的文件。

文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的 最小的一个下标,作为新的文件描述符。

 那么问题来了,c语言为什么要这么做?

首先我们先理解,在进行文件操作时候可以使用系统调用也可以使用语言提供的操作方法。推荐语言提供的操作方法,因为系统不同(linux,windows,mac)那么系统的调用接口就不同,代码不具有跨平台性(使用linux代码无法在windows/mac运行)。

那么为什么语言提供的操作方法就可以呢?举例c语言,因为c语言本身的源代码-标准库的设计(通过条件编译,同一份源代码但是在不同平台运行不同代码),各个平台拥有各自的c标准库。所以所有的语言要想都具有跨平台性,则要求所有的语言对不同的平台的系统调用进行封装,则不同的语言封装的时候文件接口就有差别了。

进程控制xshell终端

ls /proc/ 
会显示很多蓝色文件夹,文件夹的名字是按照当前进程的pid来做的


显示这个进程的所有属性消息,也可以ls -l /proc/5903

那么我们也可以在通过左边终端写右边终端

 

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

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

相关文章

【小浩算法 BST与其验证】

BST与其验证 前言我的思路思路一 中序遍历判断数组无重复递增思路二 递归边界最大值最小值的传递 我的代码测试用例1测试用例2 前言 BST是二叉树一个经典应用&#xff0c;我们常常将其用于数据的查找以及构建平衡二叉树等。今天我所做的题目是验证一颗二叉树是否为二叉搜索树&…

Web,Sip,Rtsp,Rtmp,WebRtc,专业MCU融屏视频混流会议直播方案分析

随着万物互联&#xff0c;视频会议直播互动深入业务各方面&#xff0c;主流SFU并不适合管理&#xff0c;很多业务需要各种监控终端&#xff0c;互动SIP硬件设备&#xff0c;Web在线业务平台能相互融合&#xff0c;互联互通&#xff0c; 视频混流直播&#xff0c;录存直播推广&a…

带环链表问题

带环链表就是字面意思带环的链表&#xff0c;例如以下这三种情况 练习题 1.给定一个链表&#xff0c;判断链表中是否带环. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;快慢指针&#xff0c;慢指针走一步&#xff0c;快指针走两步&#xff0c;两个指针从链表的起…

硅片和SOI哪个研究方向更好?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我研一将要结束&#xff0c;即将进入课题组。我们课题组方向有硅片和soi两种方向&#xff0c;这两种方向该如何选择呢&#xff1f; 硅片与…

python离线安装包的方法

python离线安装包的方法 访问对应安装包的镜像文件的网站找到适合自己的whl文件安装 访问对应安装包的镜像文件的网站 https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/<包名>/找到适合自己的whl文件 安装 下载完成后&#xff0c;进入opencv_python-3.4.11.45-c…

这是一个简单网站,后续还会更新

1、首页效果图 代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>爱德照明网站首页</title> <style> /*外部样式*/ charset "utf-8"…

标准降水指数(SPI)、标准化降水蒸发蒸腾指数(SPEI)和帕尔默干旱指数(PDSI)的下载、读取和可视化

数据下载网址&#xff1a;WWDT Data (dri.edu)https://wrcc.dri.edu/wwdt/data/PRISM/ 以SPI为例说明&#xff0c; 标准化降水指数(Standardized Precipitation Index, SPI)是由Mckee et al(.1993)分析美国科罗拉多干旱时,发现降水服从偏态分布,基于此提出了标准化降水指数。…

【千帆平台】使用AppBuilder三步手搓应用创建精准多轮对话agent之K12互动式练习题

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用头像应用名称应用描述角色指令能力扩展开场白 …

gitlab设置保护分支

gitlab设置保护分支方法 进入代码仓库首页&#xff0c;找到settings下的repository并点击进入 找到Protected Branches 下的Exoand按钮&#xff0c;并点击展开 可以看到已经存在默认的保护分支&#xff0c;通常是master/main分支&#xff0c;也可以添加新的保护分支 新建保护分…

使用idm下载百度云被限速 idm下载大文件后要整合 idm下载百度网盘有限制最新解决办法教程 idm限速解除方法

Internet Download Manager简称IDM,是一款Windows系统专业下载加速工具,IDM下载器支持多种类型文件下载,并能完美恢复各种中断的下载任务,是一款Windows平台下的多线程下载器&#xff0c;支持浏览器自动嗅探功能下载资源文件&#xff0c;包括视频、音频以及图片等类型文件&…

BUUCTF:Web 解析(一)

一、[极客大挑战 2019] EasySQL 点击链接进入靶场 登录页面&#xff0c;查看页面源代码发现没留注释 先输入 admin or 11# 提交看看&#xff08;根据题意猜测考察的 SQL 注入&#xff09; 显示 Flag 二、[极客大挑战 2019] Havefun 打开靶场 页面只有一只猫&#xff0c;打开…

区块链 | IPFS:Merkle DAG(进阶版)

&#x1f98a;原文&#xff1a;Merkle DAGs: Structuring Data for the Distributed Web &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 Merkle DAG 当我们在计算机上表示图时&#xff0c;必须通过提供节点和边的具体表示来编码我们的数据…

jenkins 部署springboot 项目

文章目录 持续集成指定tag发布 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 持续集成 为了让程序代码可以自动推送到测试环境基于Docker服务运行…

服务网关GateWay原理

文章目录 自动装配核心类GatewayAutoConfigurationDispatcherHandler请求处理阶段apply方法httpHandler#handle方法WebHandler#handle方法DispatchHanlder#handle方法第一步 getHandler获取请求映射第二步 invokeHandler 请求适配第三步 handleResult请求处理总结 上一篇博文我…

C语言二叉树和堆

二叉树基础知识&#xff1a; 1.栈、队列和顺序表都是线性结构 但是二叉树不是&#xff0c;二叉树是多分支结构 2.任何一棵树都可以拆分为子树和根节点&#xff0c;许多二叉树的相关问题都是用分治的思想进行函数的递归进行解决。 例&#xff1a;前序&#xff0c;中序&#x…

社交媒体数据恢复:推特、Twitter

推特&#xff08;Twitter&#xff09;数据恢复&#xff1a;如何找回丢失的内容 随着社交媒体的普及&#xff0c;越来越多的人开始使用推特&#xff08;Twitter&#xff09;来分享生活点滴、发表观点和获取信息。然而&#xff0c;有时候我们会不小心删除了重要的推文&#xff0…

【牛客网】排列计算

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 如果直接涂色来计算单点权重&#xff0c;2e5*2e5必然超时。 所以用差分进行优化。 3. 代码实现 #include<bits/stdc.h> using name…

漏洞扫描神器:Nessus 保姆级教程(附破解步骤)

一、介绍 Nessus是一款广泛使用的网络漏洞扫描工具&#xff0c;用于发现和评估计算机系统和网络中的安全漏洞。它是一款功能强大的商业工具&#xff0c;由Tenable Network Security开发和维护。 以下是Nessus的一些主要特点和功能&#xff1a; 1. 漏洞扫描&#xff1a;Nessu…

来一篇错题集(虽然简单吧)

一.Assembly via Remainders #include<bits/stdc.h> using namespace std; typedef long long ll; int a[2000]; int b[2000]; int main(){int t;cin>>t;while(t--){int n;cin>>n;for(int i1;i<n-1;i){cin>>b[i];}int x1000000000;//使用1000000000…

241 基于matlab的Dijkstra算法进行路径规划

基于matlab的Dijkstra算法进行路径规划。可根据实际情况输入障碍物和起止点坐标信息&#xff1b; 输出避碰最短路径&#xff1b; 能够利用切线图算法对障碍物区域进行环境建模&#xff0c;设置障碍物的位置和区域。利用Dijkstra算法进行路径规划。程序已调通&#xff0c;可直接…