基础IO认识

回顾文件

我们之前认识文件只是在语言程度上理解,但是我们理解的不够彻底,要想真正理解文件要在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.mzph.cn/diannao/6218.shtml

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

相关文章

leetcode_43.字符串相乘

43. 字符串相乘 题目描述&#xff1a;给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 &q…

蓝桥杯练习系统(算法训练)ALGO-951 预备爷的悲剧

资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 英语预备爷gzp是个逗(tu)比(hao)&#xff0c;为了在即将到来的英语的quiz中不挂科&#xff0c;gzp废寝忘食复习英语附录单词…

SpringBoot 基础简介

目录 1. SpringBoot 概述 1.1. 为什么会有springboot 1.1.1. 传统Spring 的两个缺点 1.1.2. Springboot 功能 2. SpringBoot 快速搭建 2.1. 创建Maven项目​编辑​编辑​编辑 2.2. 导入SpringBoot起步依赖 2.3. 定义controller 2.4. 添加引导类 2.5. 启动访问 3. Sprin…

Hardened Ubuntu 24.04 LTS发布

Ubuntu 24.04 有了LTS 版本&#xff0c;就是长期稳定支持版 侧重安全的增强加固版本Hardened Ubuntu 24.04 LTS也随之到来。 hardened Linux 自 2022 年推出以来&#xff0c;支持 amd64/x86_64 和 arm64 硬件架构&#xff0c;并提供 AWS 版本和 on-premise 版本&#xff0c;获…

使用node调用chrome(基于selenium-webdriver包)

下载测试版chrome和chromedriver https://googlechromelabs.github.io/chrome-for-testing/ 把chromedriver复制到chrome的文件里 设置环境变量 编写代码 const { Builder, Browser, By, Key, until } require(selenium-webdriver) const puppeteer require(puppeteer)//查…

Spring 如何解决 Bean 循环依赖

循环依赖解释 bean A 属性注入时依赖bean B &#xff0c;并且bean B属性注入时也依赖bean A &#xff0c;造成 bean A 和bean B 都无法完成初始化问题&#xff0c;形成了闭环。 注意 项目中存在Bean的循环依赖&#xff0c;是Bean对象职责划分不明确、代码质量不高的表现&#…

2024/5/2 英语每日一段

Enablers’ fate is inherently linked to adopters, which are their ultimate customers, after all. That dynamic won’t flip overnight, but adopters able to demonstrate progress on AI initiatives will increasingly get credit from investors in the form of high…

基于SSM的“一汽租车辆共享平台”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“一汽租车辆共享平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 租车界面 订单管理界面 财务报表界面 理赔界面 …

I/O体系结构和设备驱动程序

I/O体系结构 为了确保计算机能够正常工作&#xff0c;必须提供数据通路&#xff0c;让信息在连接到个人计算机的CPU、RAM和I/O设备之间流动。这些数据通路总称为总线&#xff0c;担当计算机内部主通信通道的作用。 所有计算机都拥有一条系统总线&#xff0c;它连接大部分内部…

Java | Leetcode Java题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int n obstacleGrid.length, m obstacleGrid[0].length;int[] f new int[m];f[0] obstacleGrid[0][0] 0 ? 1 : 0;for (int i 0; i < n; i) {for (i…

二叉树的递归详解:以例题计算二叉树第k层为例

1.代码速览 1.1节点的构建 #include<iostream> using namespace std; class ListNode { public:friend void fun();friend int TreeKLevel(ListNode* root, int k);ListNode(int val):_val(val),leftnext(nullptr),rightnext(nullptr){} private:int _val 0;class Lis…

【doghead】ubuntu构建libuv

按照官方的文档2024年3月的版本。首先构建libuv 最终构建的还得了test 构建过程 zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/thunderbolt/ayame/zhb-bifrost$ ls Bifrost-202403 README.md draw player-only worker 大神的带宽估计.png zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/…

Codeforces Round 943 (Div. 3)A-D

div3补提 https://codeforces.com/contest/1968 A&#xff1a;需要求gcd(x,y)y的最大值,给的范围只有1-1000&#xff0c;可以直接暴力来做。 求最大公约数的代码gcd&#xff0c;如果x<y,需要叫交换x和y的值&#xff0c;如果y等于0&#xff0c;就返回x&#xff0c;用递归的形…

240503-关于VisualStudio2022社区版的二三事

240503-关于VisualStudio2022社区版的二三事 1 常用快捷键 快捷键描述AltEnter选中代码片段以提取方法Alt上下箭头移动选中的代码片段F12转到方法定义CtrlR*2批量修改选中的变量名称 2 自动生成构造函数 3 快速重写父类方法 4 节约时间&#xff1a;写代码使用“头插法”&…

Python面试十问2

一、如何使用列表创建⼀个DataFrame # 导入pandas库 import pandas as pd# 创建一个列表&#xff0c;其中包含数据 data [[A, 1], [B, 2], [C, 3]]# 使用pandas的DataFrame()函数将列表转换为DataFrame df pd.DataFrame(data, columns[Letter, Number]) # 列名# 显示创建的…

华为OD机试 - 会议室占用时间段(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

matlab绘制散点图

在MATLAB中&#xff0c;可以使用scatter函数来绘制散点图。下面是一个简单的例子&#xff0c;说明如何使用scatter函数来绘制散点图。 假设你有一组x坐标和一组y坐标&#xff0c;你想在图上绘制它们&#xff1a; % 创建x和y的随机数据 x randn(1, 100); % 从正态分布中生成…

【iOS】pthread、NSThread

文章目录 前言一、pthread 使用方法pthread 其他相关方法 二、 NSThread创建、启动线程线程相关用法线程状态控制方法NSThread 线程安全和线程同步场景 线程的状态转换 前言 五一这两天准备将GCD相关的知识完&#xff0c;同时NSOperation与NSThread、pthread也是相关知识&…

前端Web开发基础知识

HTML定义 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 什么是 HTML? HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup LanguageH…

汇编语言——比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示MATCH, 不相同则显示NO MATCH

CMPS 串比较指令&#xff1a; CMPS SRC, DST CMPSB &#xff08;字节&#xff09; CMPSW &#xff08;字&#xff09; 执行操作&#xff1a; ((SI)) - ((DI)) 根据比较结果置条件标志位&#xff1a;相等 ZF1&#xff1b;不等 ZF0 字节操作&#xff1a;(SI)←(SI)1, (DI)←(DI…