基础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.xdnf.cn/news/1410786.html

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

相关文章

PG实例连接访问控制

实例访问控制可以控制来自于不同主机&#xff0c;不同用户是否允许访问指定的数据库&#xff0c;以及验证方式。 与oracle中的连接管理器的功能相同&#xff0c;之前有写过一篇oracleCMAN连接管理器的配置实操&#xff1a; 配置oracle连接管理器&#xff08;cman&#xff09;…

CAN标准帧和扩展帧

1、CAN总线有两个ISO国际标准&#xff1a; ISO11519和ISO11898。 1)、ISO11519定义低速CAN通信标准&#xff1a;通信速率为10&#xff5e;125Kbps&#xff0c;属于开环总线&#xff1b; 传输速率为40Kbps时&#xff0c;总线长度可达1000米&#xff1b; 低速CAN是一个“开环网络…

Linux 麒麟系统安装

国产麒麟系统官网地址&#xff1a; https://www.openkylin.top/downloads/ 下载该镜像后&#xff0c;使用VMware部署一个虚拟机&#xff1a; 完成虚拟机创建。点击&#xff1a;“开启此虚拟机” 选择“试用试用开放麒麟而不安装&#xff08;T&#xff09;”&#xff0c;进入op…

同步互斥问题模型

目录 一. 生产者-消费者问题二. 多生产者-多消费者问题三. 吸烟者问题四. 读者-写者问题五. 哲学家进餐问题 \quad 一. 生产者-消费者问题 \quad 问题分析 \quad 如何实现 \quad \quad V操作不会导致进程阻塞&#xff0c;因此两个v操作顺序可以交换。 \quad 二. 多生产者-多消费…

[答疑]Eric Evans这样画是真不懂还是有特别考虑

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 albert 2024-5-2 10:14 您觉得Evans这样画是真不懂还是有特别的考虑&#xff1f; &#xff08;补注&#xff1a;指的是“《领域驱动设计》里的这个不变式是不是也是错的”中提到的图…

重看Spring聚焦BeanDefinition分析和构造

目录 一、对BeanDefinition的理解 &#xff08;一&#xff09;理解元信息 &#xff08;二&#xff09;BeanDefinition理解分析 二、BeanDefinition的结构设计分析 &#xff08;一&#xff09;整体结构体会 &#xff08;二&#xff09;重要接口和类分析 三、构造 BeanDef…

16、ESP32 Web

Web 服务器具有移动响应能力&#xff0c;可以使用本地网络上的任何设备作为浏览器进行访问。 示例功能&#xff1a; 构建 Web 服务器控制连接到 ESP32 的 LED在本地网络的浏览器上输入 ESP32 IP 地址访问 Web 服务器通过单击 Web 服务器上的按钮&#xff0c;更改 LED 状态 //…

triton之normalization教程

一 前向 在上式中,x是代表一个tensor import torchimport triton import triton.language as tltry:# This is https://github.com/NVIDIA/apex, NOT the apex on PyPi, so it# should not be added to extras_require in setup.py.import apexHAS_APEX = True except Module…

怎样通过Java语言实现远程控制8路控制器/断路器

怎样通过Java语言实现远程控制8路控制器/断路器呢&#xff1f; 本文描述了使用Java语言调用HTTP接口&#xff0c;实现控制8路控制器/断路器&#xff0c;支持8路输出&#xff0c;均可独立控制&#xff0c;可接入各种电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0…

zabbix监控Tongweb7企业版(by lqw+sy)

此贴参考zabbix通过jmx监控Tongweb7企业版&#xff08;by lqw&#xff09;&#xff0c;是在此帖子的基础和同事整理的文档基础上重新部署验证的优化版&#xff0c;使用的是centos7。 优点&#xff1a; 1.不需要通过jmx配置进行监控。&#xff08;jmx配置需要修改tongweb的配置…

前端基础学习html(1)

1.标题标签.h1,h2...h6 2.段落标签p 换行标签br 3.加粗strong(b) /倾斜em(i) /删除 del(s) /下划线ins(u) 4.盒子&#xff1a;div //一行一个 span//一行多个 5.img :src alt title width height border 图片src引用&#xff1a;相对路径 上级/同级/中级 绝对路径&#xff…

【CTF-Crypto】修复RSA证书入门汇总

证书修复 文章目录 证书修复基础知识Truncated 1Truncated 2Jumbled 基础知识 为什么要引入证书&#xff1f; 在正常题目中&#xff0c;大部分直接给出了数字&#xff0c;但是数字在现实世界中传输不稳定&#xff0c;容易在某处出现错误&#xff0c;所以我们将所有的数字信息…

移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机

这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外&#xff0c;读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…

【c++leetcode】35. Search Insert Position

问题入口 二分搜索 时间复杂度O(logn) class Solution { public:int searchInsert(vector<int>& nums, int target) {int start 0;int end nums.size() - 1;while (start < end){int mid (start end) / 2;if (nums[mid] target){return mid;}else if(nums…

【C++】1.贪心算法:零钱兑换的奇妙之旅

欢迎来CILMY23的博客 本篇主题为 贪心算法&#xff1a;零钱兑换的奇妙之旅 个人主页&#xff1a;CILMY23-CSDN博客 个人专栏&#xff1a; Python | C | C语言 | 数据结构与算法 上一篇C博客&#xff1a;掌握C函数重载和引用开启代码优化的新篇章 感谢观看&#xff0c;支…

电机控制器电路板布局布线参考指导(七)电流检测模块布局布线

电机控制器电路板布局布线参考指导&#xff08;七&#xff09;电流检测模块布局布线 1.高侧电流检测2.低侧电流监测3.两相和三相电流检测4.关键元器件选型要求5.布局6.布线7.工具设置8.输入和输出滤波9.注意事项 很多电机驱动器产品系列包括内置了电流感测功能的器件&#xff0…

用keras识别狗狗

一、需求场景 从照片从识别出狗狗 from keras.applications.resnet50 import ResNet50 from keras.preprocessing import image from keras.applications.resnet50 import preprocess_input, decode_predictions import numpy as np# 加载预训练的ResNet50模型 model ResNet5…

Postgresql的安装教程dbever的连接pgAdmin4的连接

最近在学习Postgresql. 首先&#xff0c;我去官网上下载了Community DL Page12.18这个版本&#xff0c;低版本比较稳定而且文档比较多 https://www.cnblogs.com/xy-ouyang/p/12009503.html 接下来&#xff0c;我去上面的链接参考了连接。打开了postgresql的服务器之后&#x…

计算机毕业设计python在线交友系统django+vue

Flask 是一个轻量级的 Web 框架&#xff0c;使用 Python 语言编写&#xff0c;较其他同类型框架更为灵活、轻便且容易上手&#xff0c;小型团队在短时间内就可以完成功能丰富的中小型网站或 Web 服务的实现。 本在线交友系统管理员功能有个人中心&#xff0c;用户管理&#xff…

初识C++ · 类和对象(下)

目录 1 再谈构造函数 2 类中的隐式类型转换 3 Static成员 4 友元和内部类 5 匿名对象 6 编译器的一些优化 1 再谈构造函数 先看一段代码&#xff1a; class Date { public :Date(int year, int month, int day){_year year;_month month;_day day;} private:int _ye…