操作系统之基础IO

基础IO

  • 一、C语言文件操作
    • 1、接口
    • 2、默认打开的流
  • 二、Linux系统接口
    • 1、open
      • (1)函数
      • (2)参数
    • 2、close
      • (1)函数
      • (2)参数
    • 3、write和read
      • (1)函数
  • 三、文件描述符fd
    • 1、概念
    • 2、图示
    • 3、默认打开的文件描述符
    • 4、重定向
      • (1)概念
      • (2)代码
      • (3)运行结果
  • 四、dup2系统调用
    • 1、函数
    • 2、作用
    • 3、代码
    • 4、运行结果
  • 五、磁盘
    • 1、图片
    • 2、作用
    • 3、抽象结构
    • 4、各区的概念
  • 六、软硬链接
    • 1、inode与文件名的关系
    • 2、硬链接
    • 3、软链接
    • 4、ln命令
    • 5、示例
  • 七、静态库与动态库
    • 1、概念
    • 2、制作库
      • (1)ar命令
      • (2)具备的文件
      • (3)代码
    • 3、使用库
      • (1)拷贝到指定目录下
      • (2)指定路径

一、C语言文件操作

1、接口

FILE * fopen ( const char * filename, const char * mode );
int fclose ( FILE * stream );
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

2、默认打开的流

  • stdin:标准输入流,文件描述符默认为0,对应的物理设备一般是键盘。
  • stdout:标准输出流,文件描述符默认为1,对应的物理设备一般是显示器。
  • stderr:标准错误流,文件描述符默认为2,对应的物理设备一般是显示器。

二、Linux系统接口

1、open

(1)函数

在这里插入图片描述

(2)参数

  • pathname:要打开或创建的目标文件。
  • flags:打开文件时,用或运算传入多个参数选项。
  • mode:当目标文件不存在且需要open创建时,该参数表示创建文件的默认权限。
  • 返回值:打开或创建成功时,返回新打开或创建的文件的文件描述符;打开或创建失败时,返回-1。

2、close

(1)函数

在这里插入图片描述

(2)参数

  • fd:文件描述符。
  • 返回值:关闭成功,返回0;关闭失败,返回-1并正确地设置errno。

3、write和read

(1)函数

在这里插入图片描述
在这里插入图片描述

三、文件描述符fd

1、概念

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

2、图示

在这里插入图片描述

3、默认打开的文件描述符

  • 标准输入,文件描述符为0,对应的物理设备一般是键盘。
  • 标准输出,文件描述符为1,对应的物理设备一般是显示器。
  • 标准错误,文件描述符为2,对应的物理设备一般是显示器。

4、重定向

(1)概念

  • 以标准输出为例,输出重定向为当关闭文件描述符1时,再打开一个文件。此时,本来应该输出到标准输出(显示器)上的内容,输出到了该文件当中。
  • 其他重定向类似。

(2)代码

int main()
{close(1);int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if(fd < 0){perror("open");return 1;}printf("snowdragon writed\n");printf("%d\n", fd);printf("%d\n", fd);printf("%d\n", fd);fflush(stdout);close(fd);return 0;
}

(3)运行结果

在这里插入图片描述

四、dup2系统调用

1、函数

在这里插入图片描述

2、作用

  • 使newfd成为oldfd的副本,如果有必要的话,会先关闭newfd。
  • 如果oldfd不是有效的文件描述符,则调用失败,并且newfd不会关闭。
  • 如果oldfd是一个有效的文件描述符,并且newfd的值与oldfd的值相同,则dup2不执行任何操作,并返回newfd。

3、代码

int main()
{int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);fprintf(stdout, "stdout writed\n");dup2(fd, 1);fprintf(stdout, "fprintf writed\n");char s[] = "fwrite writed\n";fwrite(s, strlen(s), 1, stdout);close(fd);fprintf(stdout, "code end\n");return 0;
}

4、运行结果

在这里插入图片描述

五、磁盘

1、图片

在这里插入图片描述
在这里插入图片描述

2、作用

  • 磁盘是一个外设,也是计算机中唯一的一个机械设备。
  • 磁盘的盘面上会存储数据,但因为计算机只认识二进制,所以向磁盘盘面写入数据,本质就是通过磁头改变磁盘盘面上的特定位置的正负极。
  • 磁盘的基本单位是扇区(512byte),但是操作系统(文件系统)和磁盘进行IO的基本单位是4KB(8*512byte),所以一个块的大小为4KB。

3、抽象结构

在这里插入图片描述

4、各区的概念

  • Super Block:存储文件系统的属性信息。
  • Group Descriptor Table:块组描述符,保存该块组的属性,例如块组的大小和使用情况,inode与block的数量与使用情况。
  • Block Bitmap:每位比特位和特定的block具有一一对应的关系,当比特位为1时,代表该block被占用,否则表示可使用。
  • inode Bitmap:每位比特位和特定的inode具有一一对应的关系,当比特位为1时,代表该inode被占用,否则表示可使用。
  • inode:一个大小为128字节的空间,保存的是对应文件的属性。
  • inode Table:保存所有文件inode空间的集合,其中inode的数量是固定的。在块组内,需要标识唯一性,即每一个inode块都要有一个inode编号。一般而言,文件、inode和inode编号都是一一对应的。
  • Data blocks:多个block(4KB)的集合,其中data block的数量是固定的,且每个Data block保存的都是特定文件的内容。一个文件可以有多个data block,并且,不是所有的data block只能存文件数据,一些data block可以存储其他块的块编号。

六、软硬链接

1、inode与文件名的关系

  • 当查找在磁盘(不在内存)中的文件时,用户使用文件名查找,实际上操作系统是通过inode编号到磁盘的分区中去查找,当查找到指定的inode后再查找该inode的属性与内容。
  • 在Linux中的inode属性里面,不存在文件名。
  • 文件所在的目录也是一个文件,而文件名与inode编号的映射关系则存储在该目录的Data blocks中。

2、硬链接

  • 在指定的目录下,建立文件名和指定inode的映射关系,增加该文件(映射关系)的引用计数。
  • 不会产生新的inode,创建的硬链接都是同一个inode,即创建的硬链接都不是独立的文件。

3、软链接

  • 通过新的inode引用另外一个文件,而文件的引用计数不会发生变化。创建的软链接具有自己的inode,即它是一个独立的文件。

4、ln命令

在这里插入图片描述
在这里插入图片描述

5、示例

在这里插入图片描述

七、静态库与动态库

1、概念

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序可以共享使用库的代码。
  • 静态库与动态库的库名需要加前缀lib。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
  • 动态链接(dynamic linking):在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中。
  • 动态库可以让多个程序共享,所以动态链接形成的可执行文件较静态链接的小。操作系统采用虚拟内存机制允许物理内存中的一份动态库被用到使用该库的所有进程中,进而节省了内存和磁盘空间。

2、制作库

(1)ar命令

在这里插入图片描述

  • ar是gnu归档工具。
  • r:插入文件成员…(member…)进入存档(替换)。如果之前存在的任何成员的名称与要添加的成员的名称匹配,则将其删除。如果member…不存在,则ar显示错误信息,然后离开,与该名称匹配的存档的任何现有成员不受干扰。
  • c:创建存档。 当请求更新并且指定的存档不存在时,则始终创建指定的存档。 但是使用此修饰符时,除非事先指定希望创建它,否则会发出警告。

(2)具备的文件

在这里插入图片描述

(3)代码

  • makefile代码
.PHONY:all                                                                                                    all:libsnow.a libsnow.so
libsnow.so:mymath_d.o myprint_d.ogcc -shared mymath_d.o myprint_d.o -o libsnow.so
mymath_d.o:mymath.cgcc -c -fPIC mymath.c -o mymath_d.o
myprint_d.o:myprint.cgcc -c -fPIC myprint.c -o myprint_d.olibsnow.a:mymath.o myprint.oar -rc libsnow.a  mymath.o myprint.o
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
myprint.o:myprint.cgcc -c myprint.c -o myprint.osnow:mymath.h myprint.h libsnow.a libsnow.somkdir -p snow/includemkdir -p snow/libcp -rf *.h snow/includecp -rf *.a snow/libcp -rf *.so snow/lib.PHONY:clean
clean:rm -rf *.o *.a *.so snow
  • shared:表示生成共享库格式。
  • fPIC:产生位置无关码。

3、使用库

(1)拷贝到指定目录下

  • .h后缀的头文件添加到头文件的默认搜索路径/usr/include/目录下。
  • .a或者.so后缀的库文件添加到库文件的默认搜索路径/lib64目录下。

(2)指定路径

  • 执行gcc 使用库的源文件 -I 头文件搜索路径 -L 库文件搜索路径 -l库名(去掉前缀lib和后缀.a或.so)。
    在这里插入图片描述
  • 使用动态库时,需要设置环境变量才能链接动态库。
  • 注意,设置的路径是使用该动态库的路径,而不是该动态库所在的路径。
    在这里插入图片描述

本文到这里就结束了,如有错误或者不清楚的地方欢迎评论或者私信
创作不易,如果觉得博主写得不错,请点赞、收藏加关注支持一下💕💕💕

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

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

相关文章

vue使用x6画流程图,简单使用

官网 https://x6.antv.antgroup.com/tutorial/getting-started 安装 npm install antv/x6 --save 使用 <template><div>3333<div id"container" style"width: 800px;height: 800px;"></div></div> </template> <…

Linux-CentOS7忘记密码找回步骤

虚拟机版本 一、进入开机页面&#xff0c;先按上下&#xff08;↑↓&#xff09;键&#xff0c;以免系统自动启动。 二、按“e”键进入编辑页面,找到如下图位置&#xff0c;输入&#xff1a;init/bin/sh 按CTRLX 进入单用户模式。 三、 输入 mount -o remount,rw / 然后按 ent…

山东齐鲁文化名人起名大师颜廷利:中国最厉害的著名哲学家思想家教育家

昔日&#xff0c;祖籍齐鲁大地山东济南的世界级文化名人颜廷利教授儿时仰慕且追随的榜样&#xff0c;经过他的坚持不懈的努力&#xff0c;今朝终于比肩同框精神意识思想灵魂并行了… 山东济南最出名的起名大师的老师&#xff0c;21世纪全球知名哲学家思想家教育家颜廷利教授表示…

视频联网共享平台LntonCVS视频监控汇聚平台视频云解决方案

LntonCVS流媒体平台是一款遵循国家GB28181标准协议的先进视频监控与云服务平台。该平台设计独特&#xff0c;能够同时接入并处理多路设备的视频流&#xff0c;支持包括RTSP、RTMP、FLV、HLS、WebRTC在内的多种视频流格式的分发。其功能丰富多样&#xff0c;涵盖了视频直播监控、…

C++入门基础

目录 一、命名空间 1.命名空间的作用 2.命名空间的定义 3.命名空间的使用 二、输入输出 1.输出运算符<< 2.输入运算符>> 三、缺省参数 四、函数重载 五、引用 1.引用简介 2.引用的注意事项 3.const引用 4.引用与指针的关系 六、inline 一、命名空间 …

什么是离线语音识别芯片?与在线语音识别的区别

离线语音识别芯片是一种不需要联网和其他外部设备支持&#xff0c;‌上电即可使用的语音识别系统。‌它的应用场合相对单一&#xff0c;‌主要适用于智能家电、‌语音遥控器、‌智能玩具等&#xff0c;‌以及车载声控和一部分智能家居。‌离线语音识别芯片的特点包括小词汇量、…

【总结】nginx源码编译安装报错./configure: error: SSL modules require the OpenSSL library.

问题现象 源码编译安装nginx时&#xff0c;执行./configure …… --with-http_ssl_module 命令安装https模块&#xff0c;需要用到openssl&#xff0c;由于机器缺少openssl库&#xff0c;报如下错误。 …… checking for openat(), fstatat() ... found checking for getaddr…

3、宠物商店智能合约实战(truffle智能合约项目实战)

3、宠物商店智能合约实战&#xff08;truffle智能合约项目实战&#xff09; 1-宠物商店环境搭建、运行2-webjs与宠物逻辑实现3-领养智能合约初始化4-宠物领养实现5-更新宠物领养状态 1-宠物商店环境搭建、运行 https://www.trufflesuite.com/boxes/pet-shop 这个还是不行 或者…

【开发实战】QT5 + OpenCV4 开发环境配置应用演示

前言 作为深度学习算法工程师&#xff0c;必须要掌握应用开发技能吗&#xff1f;搞工程肯定是必须要会界面开发&#xff0c;QT就是一个很不错的选择。本文以QT5.15 OpenCV4.8 OpenVINO2023为例&#xff0c;搭建应用开发环境&#xff0c;演示深度学习模型的QT应用案例。 开发…

数学建模~~~SPSS相关和回归分析

目录 1.双变量相关分析 1.1理论基础 1.2简单散点图的绘制介绍 1.3相关性分析 1.4分析相关性结果 2.简单线性回归分析 2.1简单概括 2.2分析过程 2.3结果分析 3.曲线回归分析 3.1问题介绍 3.2分析过程 3.3结果分析 1.双变量相关分析 1.1理论基础 双变量相关分析并不…

关于Linux的面试题(实时更新中~)

一、软连接和硬连接的区别&#xff1a; 软连接创建方式 ln -s 被链接文件 链接文件 &#xff08;1&#xff09;软链接是一个链接文件&#xff1b; &#xff08;2&#xff09;软链接有着自己的 inode 号&#xff08;文件编号&#xff09;&#xff1b; &#xff08;3&#…

趣谈linux操作系统 9 网络系统-读书笔记

文章目录 网络协议栈基础知识回顾网络分层网络分层的目的各层作用简介延伸-ip地址,有类,无类,cidr socket实现分析tcp/udp回顾socket编程回顾TCP编程回顾UDP编程回顾差异 socket相关接口实现浅析sokcet实现解析创建socket的三个参数socket函数定义及其参数创建socket结构体关联…

最新CSM客户成功 OKR 案例:以指导、激励和调整您的团队

客户是任何企业的命脉&#xff0c;而客户服务是与客户接触的第一站&#xff0c;是实现目标和扩大组织规模是以保留客户和追加销售为前提的。 客户成功CSM是一种商业方法&#xff0c;确保客户在使用你的产品/服务时达到他们想要的结果。客户成功是以关系为中心的客户管理&#…

实战篇(十):使用Processing创建可爱花朵:实现随机位置、大小和颜色的花朵

使用Processing创建可爱花朵 0.效果预览1. 引言2. 设置Processing环境3. 创建花朵类4. 实现花瓣绘制5. 绘制可爱的笑脸6. 鼠标点击生成花朵7. 完整代码8. 总结与扩展0.效果预览 在本教程中,我们将使用Processing编程语言来创建一个可爱的花朵生成器。通过封装花朵为一个类,并…

最小化研发过程质量管理,质量与效率之间的平衡

前言 是不是流程约束越多&#xff0c;效率越低&#xff1f;不然&#xff0c;如果因为缺了流程约束&#xff0c;而搞砸了质量&#xff0c;那么一切都将归零。 所以找到一套适合自身的研发过程质量管理方式&#xff0c;在质量与效率之间趋向平衡是每个研发团队所必须要考虑的事…

Adobe Premiere Pro(Pr)安装包软件下载

一、简介 Adobe Premiere Pro&#xff08;简称Pr&#xff09;是由Adobe公司开发的一款功能强大的视频编辑软件。它支持多平台使用&#xff0c;包括Windows和Mac系统&#xff0c;并且拥有良好的兼容性和高效的性能。Premiere Pro不仅提供了视频剪辑、特效添加、音频处理等基本功…

go语言Gin框架的学习路线(七)

GORM入门(基于七米老师) 目录 GORM入门 安装 连接数据库 连接MySQL 连接PostgreSQL 连接Sqlite3 连接SQL Server 我们搞一个连接MySQL的例子 创建数据库 GORM操作MySQL GORM是一个流行的Go语言ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它提供了一种方…

Haproxy服务

目录 一.haproxy介绍 1.主要特点和功能 2.haproxy 调度算法 3.haproxy 与nginx 和lvs的区别 二.安装 haproxy 服务 1. yum安装 2.第三方rpm 安装 3.编译安装haproxy 三.配置文件详解 1.官方地址配置文件官方帮助文档 2.HAProxy 的配置文件haproxy.cfg由两大部分组成&…

IAR环境下STM32+IAP方案的实现

--基于STM32F103ZET6的UART通讯实现 一、什么是IAP&#xff0c;为什么要IAP IAP即为In Application Programming(在应用中编程)&#xff0c;一般情况下&#xff0c;以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了&#xff0c;如果在设备使…

【C++】 string类的模拟实现

目录 一、我们先创建三个文件分别为 String.h&#xff08;声明&#xff09;、String.cpp&#xff08;定义&#xff09;、teat.cpp&#xff08;测试&#xff09; 二、成员函数 构造函数与析构函数 &#x1f31f;string() &#x1f31f;string(const char* str) &#x1f…