Linux 基础IO(个人笔记)

Linux基础 IO

  • 1.C文件IO操作
    • 1.1 hello.c写文件
    • 1.2 hello.c读文件
    • 1.3 stdin&stdout&stderr
  • 2.系统文件I/O
    • 2.1 hello.c写文件
    • 2.2 hello.c读文件
    • 2.3 open函数介绍
    • 2.4 文件描述符 fd
      • 2.4.1 文件描述符的分配规则
      • 2.4.2 重定向
      • 2.4.3 dup2系统调用
      • 2.4.4 C文件结构体FILE
      • 2.4.5 C文件缓冲区
  • 3. 文件系统
    • 3.1文件的软硬链接
      • 3.1.1 软链接
      • 3.1.2 硬链接
  • 4. 动静态库


1.C文件IO操作

1.1 hello.c写文件

#include<stdio.h>
#include<string.h>int main()
{FILE* fp = fopen("myfile", "w");if (fp == NULL){printf("fopen error\n");}const char* msg = "hello LJH\n";int count = 5;while (count--){fwrite(msg, strlen(msg), 1, fp);}fclose(fp);return 0;
}

1.2 hello.c读文件

#include<stdio.h>
#include<string.h>int main()
{FILE* fp = fopen("myfile", "r");if (!fp){printf("fopen error!\n");}char buf[1024];const char* msg = "hello LJH!\n";while (1){size_t s = fread(buf, 1, strlen(msg), fp);if (s > 0){buf[s] = 0;printf("%s", buf);}if (feof(fp)){break;}}fclose(fp);return 0;
}

1.3 stdin&stdout&stderr

C默认会打开三个输入输出流:stdin,stdout,stderr
且三个流的类型都是FILE*

2.系统文件I/O

系统接口来访问文件

2.1 hello.c写文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{umask(0);int fd = open("myfile", O_WRONLY | O_CREAT, 0644);if (fd < 0){perror("open");return 1;}int count = 5;const char *msg = "hello LJH!\n";int len = strlen(msg);while (count--){write(fd, msg, len);}close(fd);return 0;
}

2.2 hello.c读文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{int fd = open("myfile", O_RDONLY);if (fd < 0){perror("open");return 1;}const char *msg = "hello LJH\n";char buf[1024];while (1){ssize_t s = read(fd, buf, strlen(msg));if (s > 0){printf("%s", buf);}else{break;}}close(fd);return 0;
}

2.3 open函数介绍

//所需要的头文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>//函数参数介绍
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);//pathname: 要打开或创建的目标文件
//flags标记位: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
//flags标记位参数:
//O_RDONLY: 只读打开
//O_WRONLY: 只写打开
//O_RDWR : 读,写打开
//这三个常量,必须指定一个且只能指定一个
//O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
//O_APPEND: 追加写
//返回值://成功:新打开的文件描述符//失败:-1

2.4 文件描述符 fd

fd其实是文件描述符表的数组下标
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2.
在这里插入图片描述

2.4.1 文件描述符的分配规则

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

2.4.2 重定向

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{close(1);int fd = open("myfile", O_WRONLY|O_CREAT, 00644);if(fd < 0){perror("open");return 1;}printf("fd: %d\n", fd);fflush(stdout);close(fd);exit(0);
}

本应该通过文件描述符输出到显示器上的内容,输出到文件myfile当中,fd=1,这就是文件重定向.
在这里插入图片描述

2.4.3 dup2系统调用

#include <unistd.h>
int dup2(int oldfd, int newfd);

测试代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{int fd = open("myfile", O_RDONLY);if (fd < 0){perror("open");return 1;}dup2(fd, 0);close(fd);char buf[1024];while (1){if(fgets(buf,sizeof(buf),stdin)==NULL){break;}printf("Read:%s",buf);sleep(1);}return 0;
}

2.4.4 C文件结构体FILE

IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问
所以C库当中的FILE结构体内部,必定封装了fd。
在这里插入图片描述
在这里插入图片描述

2.4.5 C文件缓冲区

这里解释下语言层面的缓冲区
先看代码

#include <stdio.h>
#include <string.h>
int main()
{const char *msg0="hello printf\n";const char *msg1="hello fwrite\n";const char *msg2="hello write\n";printf("%s", msg0);fwrite(msg1, strlen(msg0), 1, stdout);write(1, msg2, strlen(msg2));fork();return 0;
}

这里进行./hello>file后,打印结果如下

hello write
hello printf
hello fwrite
hello printf
hello fwrite

原因是:
1.C库函数写入文件时是全缓冲,而写入显示器是行缓冲
2.当文件重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲
3.然而放在缓冲区的数据就不会被立即刷新,fork之后也是如此
4.但进程退出后,会统一刷新,写入文件中
5.但是fork之后,父子数据发生写时拷贝,父进程准备刷新的时候,子进程也就有了同样的一份数据,也就是两份数据
6.write系统调用,就没有所谓的缓冲区
在这里插入图片描述

3. 文件系统

权限 硬链接数 文件所有者 文件所属组 文件大小 文件最后修改时间 文件名
在这里插入图片描述
除了ls -l 查看之外,stat+文件名,能查看更多信息
在这里插入图片描述
从硬件开始了解文件系统
在这里插入图片描述
磁盘存储的逻辑抽象结构
将磁盘盘片想象成为线性空间

在这里插入图片描述
以上是按照扇区进行存取,也可以基于文件系统,按照文件块为单位进行数据存取,也就是LBA
在这里插入图片描述
一个磁盘都会进行分区管理,一般的磁盘500g内存,进行分区管理
然而管理磁盘内存是可以进行迁移的,要管好100g,也就只需要管好2g
在这里插入图片描述
保存文件属性是通过inode保存
inode节点表:存放文件属性:文件大小,所有者,最近修改时间等
在这里插入图片描述
数据区:存放文件内容
在这里插入图片描述
inode位图:每个bit表示一个inode是否空闲可用
块位图:记录data block中那个数据块已经被占用,那个数据块没有被占用
超级块:存放文件系统本身的结构信息,如果被破坏,整个文件系统瘫痪
在这里插入图片描述

3.1文件的软硬链接

操作系统在磁盘中找文件不是通过文件名,而是通过inode,Linux中可以让多个文件名对应同一个inode,也就是不同分区可能会有相同的inode

删除文件其实是由两步组成:
1.在目录中将文件和inode的映射关系删除
2.将文件的硬链接数减1,如果减到了0,则将对应的磁盘文件释放掉。

软链接是通过名字引用另一个文件,可以理解为windows中桌面快捷方式的创建,是一个独立的文件,而硬链接不是一个独立的文件,而是在指定目录内部的一组映射关系:文件名<—>inode的映射关系

3.1.1 软链接

在Linux中,创建软链接(符号链接)可以使用 ln 命令,配合 -s 参数。软链接是指向另一个文件或目录的引用。

ln -s [目标文件或目录] [链接名称]

软链接可以跨文件系统,而硬链接不能。
如果目标文件被删除,软链接将变为“悬挂”状态,仍然存在但指向无效。
软链接的名称可以是相对路径或绝对路径。

3.1.2 硬链接

在Linux中,创建硬链接可以使用 ln 命令,不需要任何额外的参数。硬链接是指向同一物理文件的不同目录项。

ln [目标文件] [链接名称]

硬链接不能跨文件系统。
硬链接与原文件共享相同的 inode,因此它们是同一个文件的不同表示。
删除原文件并不会影响硬链接,因为它们仍然指向相同的数据。
目录通常不允许创建硬链接,除非使用特权权限。

4. 动静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。

静态库的本质是将库中的源代码直接翻译成为.o目标的二进制文件,然后打包在一起

静态库生成makefile文件参考

static-lib=libmymath.a$(static-lib):Add.o Div.o Mul.o Sub.oar -rc $@ $^
%.o:%.cgcc -c $<
#Test:Add.o Div.o Mul.o Sub.o TestMain.o
#	gcc -o $@ $^.PHONY:output
output:mkdir -p mymath_lib/includemkdir -p mymath_lib/libcp -f *.h mymath_lib/includecp -f *.a mymath_lib/lib.PHONY:clean
clean:rm -rf *.o *.a mymath_lib

动态库生成Makefile文件参考

dy-lib=libmymath.so$(dy-lib):Add.o Div.o Mul.o Sub.ogcc -shared -o $@ $^
%.o:%.cgcc -fPIC -c $<.PHONY:output
output:mkdir -p mymath_lib/includemkdir -p mymath_lib/libcp -f *.h mymath_lib/includecp -f *.so mymath_lib/lib.PHONY:clean
clean:rm -rf *.o *.so mymath_lib

gcc默认是动态链接的,但个别库,如果你只提供.a,gcc也是没有办法,只能局部性的把你指定的.a,进行静态链接,其他库正常动态链接,如果加上-static,就必须要.a
在这里插入图片描述
运行动态库的方法:
1.直接安装到系统中
在这里插入图片描述

2.通过软连接,查找动态库
3.LD_LIBRARY_PATH,使用环境变量的方式,让系统找到自己的动态库
4.直接更改系统关于动态库的配置文件
在这里插入图片描述
动态库加载的原理

gcc -fPIC -c XXX.c

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

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

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

相关文章

了解输出电源优先级

主要又SUB&#xff0c;SBU以及USB三种模式。 调试10kW逆变器存在的输出电源优先级的问题&#xff0c;当优先级为SUB时&#xff0c;利用电压源模拟电池&#xff0c;当电池电压超过58.4V&#xff0c;即过压&#xff0c;在接入市电&#xff0c;市电继电器仍然闭合&#xff0c;仍然…

使用kubectl快速查看各个节点的CPU和内存占用量

本文章视频教程地址&#xff1a;https://www.bilibili.com/video/BV1TdxkedE1K 前言 笔者之前写过一篇文章关于在Kubernetes上安装 Prometheus 和 Grafana 监控去查看Kubernetes各个节点的资源占用率&#xff0c;文章地址&#xff1a;https://blog.csdn.net/m0_51510236/arti…

大模型(LLM) 是仅仅比 模型(Model) 更大吗?

我们日常经常提到模型 model&#xff0c;大模型LLM&#xff0c;大家都知道这两者之间的区别和联系吗&#xff1f; 只是如下图这样&#xff0c;大小的区别吗&#xff1f;下面我们对模型model和大模型LLM进行解释和描述 什么是模型&#xff1f; 模型是机器学习中一个核心概念&a…

matlab2019b-2024b knnclassify无法识别的问题(亲测,已解决)

matlab2019a-2024b 已经移除了knnclassify分类&#xff0c;修改了名称和功能&#xff0c;如果你还想使用它&#xff0c;就必须在2018版本以前的旧版本中找相关的工具箱&#xff08;这是免费的哦&#xff0c;如果官网下载 需要付费&#xff09;。 这里本人从2014a中分离出的工具…

JS设计模式之观察者模式:观察者与可观察对象的巧妙互动

一. 前言 在前端开发中&#xff0c;我们经常会遇到需要对用户的操作进行响应的场景&#xff0c;例如页面上的按钮点击、输入框内容变化等。为了实现这种响应式的设计&#xff0c;我们可以使用观察者模式来解耦各个组件之间的依赖关系。 本文将详细介绍观察者模式的原理和实现…

使用【apifox】进行压测-保姆级教程【无需脚本】

1.根据接口文档进行测试&#xff0c;写一个接口&#xff0c;能够调通即可 2.选择“从接口导入”&#xff0c;选择刚刚测试的接口 3.选择一个环境&#xff0c;我这里用的云服务器http://x.xx.xxx.xx &#xff08;端口号写不写都行&#xff0c;我是加上了&#xff09; 4.选性…

element-ui 通过按钮式触发日期选择器

element ui 写在前面1. 自定义的日期时间组件CustomDatePicker.vue2. 页面效果总结写在最后 写在前面 需求&#xff1a;elementui中日期时间选择器&#xff0c;目前只能通过点击input输入框触发日期选择器&#xff0c;我希望能通过其他方式触发日期选择器同时把input输入框去掉…

【IoT-NTN】系统消息SIB32信令分析

3GPP卫星通信发展迅速&#xff0c; TS36.331 R17中新增SIB32携带星历信息&#xff0c;本文对SIB32的信令内容进行了分析。 SystemInformationBlockType32 概述 SystemInformationBlockType32 是用于提供预测非连续覆盖的卫星辅助信息的系统信息块。这个信息块仅在非地面网络&…

初学者如何快速入门Python(详细攻略),从0到精通,不信你学不会!

近年来&#xff0c;人工智能领域的飞速发展极大地改变了各个行业的面貌。当前最新的技术动态&#xff0c;如大型语言模型和深度学习技术的发展&#xff0c;展示了深度学习和机器学习技术的强大潜力&#xff0c;成为推动创新和提升竞争力的关键。特别是PyTorch&#xff0c;凭借其…

刚面试完的前端面试题

今天晚上参加了一场长达40多分钟的技术面。我觉得面试官非常专业&#xff0c;问的问题也都是很棒的&#xff01;自己很多知识都需要学习。所以我决定回想并记录下来。回答不对的地方欢迎大家指正&#xff01; 我自己在小本本上回忆出来的大概就是26道题。后期我会持续更新我学习…

【测试-BUG篇】软件测试的BUG知识你了解多少呢?

文章目录 1. 软件测试的生命周期2. BUG3. BUG的生命周期4. 与开发人员起争执怎么办 1. 软件测试的生命周期 &#x1f34e;软件测试 贯穿整个软件的生命周期&#xff1b; &#x1f34e;软件测试的生命周期是指测试流程&#xff1b; ①需求分析 用户角度&#xff1a;软件需求是…

资源管理5步法:优化你的项目管理

作为项目经理&#xff0c;负责交付项目是一项复杂且要求严格的任务。在缺乏必要的专业知识、工具、设备以及资金支持的情况下&#xff0c;成功完成项目几乎是不可能的。 因此&#xff0c;项目资源的规划与分配是项目启动前至关重要的环节。若未能妥善规划&#xff0c;将可能导…

测试卡(1)灰卡

#灵感# 灰卡为什么是18%&#xff1f;文章分为三部分&#xff0c;前部分&#xff0c;解释灰卡的定义&#xff0c;后部分是 市场买的18%灰卡的说明书&#xff0c;其中穿插了网络上搜到的灰卡使用案例。 目录 18% 中性灰卡应用说明 1&#xff09; 曝光水平 例子&#xff1a;用灰…

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…

初识Linux以及Linux的基本命令

千呼万唤始出来&#xff0c;Linux系列的文章从今天起开始不定期更新&#xff0c;闲话少叙&#xff0c;我们直接进入正题 初识Linux 这一部分我不打算给大家讲Linux的发展史啥的&#xff0c;直接从系统方面开始介绍 首先&#xff0c;我们平时用win10或win11所看到的桌面以及各…

Pycharm 本地搭建 stable-diffusion-webui

一、下载工程源码 Github官方连接 https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、Pycharm打开工程 1、设置环境 文件-设置-项目-Python解析器-添加解释器-添加本地解释器 Conda环境-创造新环境-Python版本3.10 注意一定要选择Python3.10版本&#xff0c;否…

985官宣:19名本科生,获国自然项目!

9月24日&#xff0c;据复旦大学教务处消息&#xff0c;国家自然科学基金委公布了2024年国家自然科学基金青年学生基础研究项目&#xff08;本科生&#xff09;立项情况&#xff0c;复旦大学共有19名基础学科专业本科生获得国家自然科学基金委资助。 此前&#xff0c;据武汉大学…

浮点数的这些特性你了解吗

问题1:下面的代码&#xff0c;输出结果是什么&#xff1a; public class CaclTest{public void test1(){float f 1.0F / 0.0F;System.out.println("f:" f)}public static void main(String[] args){CaclTest ct new CaclTest();ct.test1();}} A. 运行抛出异常:j…

vue3监听子组件的生命周期

1.Vue3使用vue&#xff0c;vue2使用hook template:<compG vue:mounted"doSomething"></compG>script://监听子组件生命周期let doSomething (e: any) > {console.log("没有啊11", e);}; 2.打印结果

誉天Linux云计算课程学什么?为什么保障就业?

一个IT工程师相当于干了哪些职业? 其中置顶回答生动而形象地描绘道&#xff1a; 一个IT工程师宛如一个超级多面手&#xff0c;相当于——加班狂程序员测试工程师实施工程师网络工程师电工装卸工搬运工超人。 此中酸甜苦辣咸&#xff0c;相信很多小伙伴们都深有体会。除了典…