基础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…

使用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)//查…

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/…

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

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

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

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

【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…

window 安装ai 基础环境(yolo8,训练推理等)

步骤: 1. python sdk 3.9以上 2. 显卡驱动 可以使用驱动精灵 直接安装N 卡推荐 3. 安装机器学习套件CUDA cuda 安装在PyTorch 需要根 PyTorch版本一致&#xff0c;我的 win-srv 最高支持 12.1 下载地址&#xff1a; https://developer.nvidia.com/cuda-toolkit-archive…

数据结构——循环结构:for循环

今天是星期五&#xff0c;明天休息&#xff0c;后天补课&#xff0c;然后就是运动会&#xff0c;接着是放假。&#xff08;但这些都和我没关系啊&#xff0c;哭死&#xff01;&#xff09;今天脑袋难得清醒一会儿&#xff0c;主要是醒的比较早吧&#xff0c;早起学了一会&#…

汇编语言——输入两个字数据(16位的数)X,Y,计算Z=X+Y,并把Z的结果显示出来

文章目录 以2进制输入&#xff0c;2进制输出&#xff08;无符号&#xff09;以2进制输入&#xff0c;2进制输出&#xff08;带符号&#xff09;以8进制输入&#xff0c;8进制输出以10进制输入&#xff0c;10进制输出以16进制输入&#xff0c;16进制输出 仅供参考 X、Y的输入可…

Windows系统启动Redis

一、下载windows版本Redis 1.1 选择一个使用的版本 在以下地址中选择一个Windows系统可以使用的版本 https://github.com/microsoftarchive/redis/tags 1.2 下载 1.3 解压到文件夹 二、启动Redis 双击redis-server.exe启动Redis 出现以下界面即启动成功 三、测试是否可以使…

Linux第二节--常见的指令介绍集合(持续更新中)

点赞关注不迷路&#xff01;&#xff0c;本节涉及初识Linux第二节&#xff0c;主要为常见的几条指令介绍。 Linux下基本指令 1. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#…