【Linux】文件IO基础知识——下篇

目录

一,stderr

2. errno全局变量

二,文件系统

1. 软链接

2. 硬链接

三,静态库

1. 制作静态库 

2. 自动化生成静态库  & 自动发布库与头文件

3. 如何使用第三方库 

法(一):修改系统文件库 

法(二):指定头文件与静态库文件(g++为例)(推荐)

四,动态库

1. 制作动态库

2. 对动态库进行打包&自动发布

法(一):添加库环境变量

法(二):动态链接库(推荐)

法(三):建立软链接(推荐)


前言

建议先学习【Linux】文件描述符基础知识——上篇-CSDN博客

一,stderr

 这里细化一下以往的理解,以往我们在学习文件描述符时,临时理解为有各自的文件,但实际上错误表也是指向显示器文件。

这个其实也比较好理解,错误信息,也是需要打印到显示器上的。

简单玩玩

很轻易的发现,,错误信息在stderr(cerr)的缓冲区, 操作中只将fd = 1重定向到 test.txt中。

等一下还有一个玩法:通过&1的指向,让2指向1的指向,当然./Test 已经重定向test.txt了。

2. errno全局变量

我们回顾一下C语言中errno函数,说白就是一个全局接收最后的错误码的变量。

头文件:<errno.h>

那如何使用呢?? 平时perror()函数就会调用,strerror(error)函数也可以打印相关错误信息。

二,文件系统

大家可以先了解机械磁盘结构,寻址方法选择。

由上图可知,Inode记录Data Block中数据的各种属性,同时,在linux中,操作系统也通过Inode进行查找文件,文件名主要是方便我们辨认。

我们下命令行上尝试输入以下指令:

ls  -al -i

问:为什么我们下载一个应用时需要很久的时间,但卸载时却很快???

答:我们回顾一下磁盘数据的分布,Inode记录文件属性,Data Blocks记录文件内容。删除操作时,Inode属性就修改为未被占用即可。如果我们误删了一个文件,只要我们能找到文件Inode的值,并且Inode和Data Block未被占用,我们就可以通过一下恢复工具进行复原。所以当我们在公司误删了一个大文件时,最好的办法时不要再操作电脑。

1. 软链接

  • 语法:ln -s 源文件 目标文件
  • 示例:ln -s /path/to/source /path/to/link
  • 创建软链接时,目标文件会指向源文件的路径。
  • 软链接可以跨文件系统,也可以链接目录

2. 硬链接

  • 语法:ln 源文件 目标文件
  • 示例:ln /path/to/source /path/to/link
  • 创建硬链接时,目标文件会与源文件共享相同的inode和数据块。
  • 硬链接只能链接文件,不能链接目录。
  • 硬链接不能跨文件系统(因为Inode跟源文件相同,不同系统下,inode就不一定相同了)

 

注意:

  • 软链接和硬链接的删除操作不会影响源文件,只会删除链接文件。
  • 软链接的权限与源文件无关,而硬链接的权限与源文件相同。
  • 软链接可以指向不存在的文件,而硬链接必须指向已经存在的文件。

问:我们在创建一个空目录时,引用计数器为什么是  2 ???

答:在目录中会自动创建2个文件 “.” " .." ,其中“.” 文件就是目录文件的硬链接

三,静态库

我们先看平常的多文件编译

1. 制作静态库 

但是别人想用你的源文件呢??但你又不太想将源代码给他?

操作:将源文件编译成 .o文件,给他们提供头文件及编译好的.o文件。

然后将main的.o文件同,其他.o文件链接,形成可执行文件即可。 

但我们会注意到,这样子我们得一个一个的对源文件进行编译,非常得繁琐,或许我们可以尝试进行打包。

这里我们得引入一个指令 ar——可以理解为:archive files 归档

ar   -r(更新)  -c(创建)   lib[自定义].a

这个lib_myfunc.a 文件就是所谓的静态库

但这并不是一键完成,后面我们将通过makefile自动化生成。

2. 自动化生成静态库  & 自动发布库与头文件

我们修改一下makefile

  1 lib_myfunc.a: my_print.o my_lib.o  2   ar -rc lib_myfunc.a my_print.o my_lib.o3 4 my_lib.o:my_lib.cc5   g++ -c -std=c++11 -o $@ $^6 my_print.o:my_print.cc 7   g++ -c -std=c++11 -o $@ $^8 9 .PHONY:publish10 publish:11   mkdir -p publish/include12   mkdir -p publish/lib 13   cp -rf *.h ./publish/include 14   cp -rf *.a ./publish/lib15 16 17 .PHONY:clean18 clean:                                                             19   rm -rf *.o lib_myfunc.a publish

这样我们就将自动打包头文件,并做到同时更新最新的静态库。

3. 如何使用第三方库 

法(一):修改系统文件库 

gcc头文件:一般放置在 /usr/include 文件中

库文件:一般放置在 /usr/lib 文件中

1. 首先向语言级头文件中添加我们的第三方头文件。

2. 库文件也是如此,添加第三方静态库。

3. 调用第三方库(以g++为例)

指令:g++ -stdc++11  源文件   -l自定义

参考:ar   -r(更新)  -c(创建)   lib[自定义].a

因为g++与gcc, 在编译时默认调用操作系统中的各自的静态库,当需要使用第三方库时,需要手动链接第三方库

这个操作有一些缺点,就是我们自己提供的头文件,静态库没有进行过安全验证,可能存在漏洞,因此不建议直接写在操作系统的头文件或库中

法(二):指定头文件与静态库文件(g++为例)(推荐)

直接用指令:
-I:指定头文件路径
-L:指定库路径
-l:  指定库文件

四,动态库

动态库和静态库是在编程中常用的两种库文件形式,它们之间的主要区别在于以下几个方面:

  1. 链接时机:静态库在编译时被链接到可执行文件中,而动态库被调用时被加载到内存中

  2. 文件大小:静态库会将所有的代码和数据都包含在库文件中,因此会增加可执行文件的大小。而动态库只包含代码和数据的引用,因此可执行文件的大小会更小。

  3. 内存占用:静态库在可执行文件中被完全复制到内存中,因此会占用更多的内存空间。而动态库在运行时被加载到内存中,并且多个程序可以共享同一个动态库(存在于地址空间的共享区),因此可以减少内存占用。

  4. 更新和维护:静态库在可执行文件中,如果库文件需要更新或修复bug,需要重新编译和链接整个程序。而动态库可以独立于可执行文件进行更新和维护,只需要替换库文件即可。

  5. 可移植性:静态库在不同的操作系统和架构上需要重新编译,因为它们与可执行文件紧密绑定。而动态库可以在不同的操作系统和架构上共享使用。

总的来说,静态库适用于需要独立运行的程序,而动态库适用于多个程序共享使用的情况。选择使用哪种库文件形式取决于具体的需求和应用场景。(来自chatgpt)

1. 制作动态库

形成.o文件时,只需要添加-fPIC,形成一个与 位置无关的动态库。
(感兴趣可以了解一下:

动态库是一种共享库,可以在多个程序中共享使用。使用动态库可以减小程序的体积,提高代码的复用性和维护性。

-fPIC选项告诉编译器生成位置无关的代码。生成位置无关代码的过程中,编译器会使用相对寻址而不是绝对寻址,以便在加载到内存时可以适应不同的内存地址。这样就可以将动态库加载到任意位置,而不需要修改代码。

总结起来,使用-fPIC选项编译代码可以生成位置无关的动态库,使得动态库可以在不同的内存地址加载而不需要修改代码。)(来自chatgpt)

2. 对动态库进行打包&自动发布

特殊之处:-shared  指令  .so 结尾
  5 lib_myfunc.so: my_print_d.o my_lib_d.o6   g++ -std=c++11 -shared -o  $@ $^7 8 my_print_d.o: my_print.cc9   g++ -std=c++11 -fPIC -c -o $@ $^10 my_lib_d.o: my_lib.cc11   g++ -std=c++11 -fPIC -c -o $@ $^

特点: 

1. 如果静态库与动态库同名,则默认调用动态库。

2. 动静态库如果仅一个,编译器则有啥用啥;

3. 如果动静态库都存在,但要求是使用静态库则添加-static选项即可

但是问题来了,下面我们编译链接完成,形成可执行程序a.out,但由于动态链接是在运行时,才被加载,所以错误才显现。

找不到动态库?? 这要引出本次要了解的知识。

不只是运行进程需要地址,但我们寻找静态库时也需要地址,那么这时就需要关于库的环境变量。

输入 echo $LD_LIBRARY_PATH 查看我们的库路径。

那如何解决找不到我们动态库的问题??

法(一):添加库环境变量

解决起来很简单,添加一个库环境变量即可。

export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库地址

但这个环境变量只是一个临时方案。

法(二):动态链接库(推荐)

通过向 /etc/ld.so.conf.d/ 创建一个配置文件——填入库地址 

如何理解目录: /etc/ld.so.conf.d/ :

在Linux系统中,ld.so.conf.d是一个目录,用于存放动态链接器(ld.so)的配置文件。该目录中的每个文件都是一个独立的配置文件,以.conf为后缀名。

然后通过 sudo  ldconfig  指令发布

解释:在安装新的动态链接库或更新已有的动态链接库时,通常需要运行ldconfig命令来更新动态链接器的配置和缓存文件。

法(三):建立软链接(推荐)

这个方法法二要容易些,且不像法一会被重置。

思想:向lib64目录,一个软链接

推荐几个好玩的库:

结语

   本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获请留下你的小赞,你的点赞和关注将会成为博主创作的动力

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

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

相关文章

液压自动化成套设备比例阀放大器

液压电气成套设备的比例阀放大器是一种电子控制设备&#xff0c;用于控制液压动力系统中的液压比例阀1。 比例阀放大器通常采用电子信号进行控制&#xff0c;以控制比例阀的开度和流量&#xff0c;以实现液压系统的可靠控制。比例阀放大器主要由以下组成部分&#xff1a; 驱动…

网络安全是什么?一文认识网络安全

一、网络安全 1.概念 网络安全从其本质上讲就是网络上的信息安全&#xff0c;指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露&#xff0c;系统可靠正常地运行&#xff0c;网络服务不中断。 &#xff08;1&#xff09;基本特征 网络安全根据其本质的界定&#…

Git构建分布式版本控制系统

一、版本控制 1、概念&#xff1a; 版本控制&#xff08;Version Control&#xff09;&#xff0c;也被称为版本管理、源代码管理或代码控制&#xff0c;是一种系统和工具&#xff0c;用于跟踪和管理文件、数据或源代码的不同版本和历史记录&#xff0c;在软件开发、文档管理…

jdbc设置StatementTimeout后还需要设置socket timeout参数吗

背景 我们设置JDBC参数时&#xff0c;不管有没有在Statement中配置超时时间StatementTimeout&#xff0c;我们都需要配置jdbc的socket timeout参数&#xff0c;那么为什么这个socket timeout参数如此必要&#xff0c;不设置又会怎么样&#xff1f; 问题真相 首先设置了State…

【Linux笔记】Linux基础权限

【Linux笔记】Linux基础权限 一、Linux权限的概念1.1、Linux中一切皆文件1.2、文件访问者的分类1.3、、Linux中的“用户白名单” 二、文件访问权限的修改2.1、权限的增加和减少的基础方法2.2、以八进制数修改权限 三、用户身份的修改3.1、修改文件的拥有者3.2、修改文件的所属组…

【VSCode】Windows环境下,VSCode 搭建 cmake 编译环境(通过配置文件配置)

除了之前的使用 VSCode 插件来编译工程外&#xff0c;我们也可以使用配置文件来编译cmake工程&#xff0c;主要依赖 launch.json 和 tasks.json 文件。 目录 一、下载编译器 1、下载 Windows GCC 2、选择编译器路径 二、配置 debug 环境 1、配置 lauch.json 文件 2、配置…

10.17课上(七段显示器,递归异或与电路)

异或的递归与数电实现 用二选一选择器实现异或函数 在异或当中&#xff0c;如果有一项为0&#xff0c;就可以把那一项消掉&#xff1b;如果有一项为1&#xff0c;就是把剩下的所有项运算完的结果取反 &#xff08;由此在算法当中可以采用递归解决&#xff09; 当w1为0时&…

百度文心一言 4.0 :如何申请百度文心一言 4.0

本心、输入输出、结果 文章目录 百度文心一言 4.0 &#xff1a;如何申请百度文心一言 4.0前言文心一言 4.0 ERNIE-Bot 4.0 &#xff1a;ERNIE-Bot 4.0 大模型深度测试体验报告如何申请千帆大模型试用百度文心一言 4.0 主要功能介绍配套发布的十余款AI原生应用插件、API 生态 百…

Python办公自动化完全指南(免费PDF)

Python办公自动化可以显著提速办公流程。通过自动执行那些重复繁琐又耗时的任务&#xff0c;大家可以把更多时间用在策略性和有创造性的工作上。 为了帮助大家更好地掌握如何将Python应用于办公自动化&#xff0c;我们整理了100个基本概念&#xff0c;让学习变得更轻松。 学习内…

C++项目实战——基于多设计模式下的同步异步日志系统-⑩-异步缓冲区类与异步工作器类设计

文章目录 专栏导读异步缓冲区设计思想异步缓冲区类设计异步工作器类设计异步日志器设计异步缓冲区类整理异步工作器类整理 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿…

[java进阶]——IO流,递归实现多级文件拷贝

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、认识IO流 二、了解编码与解码 二、IO流体系 三、字节输入输出流 四、字符输入输出流 五、多级文件拷贝 一、认识IO流 IO流也叫输入流(intput)、输出流(onput)&#xff0c;该流就像java程序同硬盘之间的…

第0章:怎么入手tensorflow

近年来人工智能的火爆吸引了很多人&#xff0c;网上相关的热门课程报名的人很多&#xff0c;但是坚持下去的人却少。那些晦涩的原理没有一定知识的积累很难能理解。 如果你对人工智能感兴趣&#xff0c;且想利用人工智能去实现某项功能&#xff0c;而不是对人工智能本身感兴趣&…

Linux性能优化--性能工具:磁盘I/O

6.0 概述 本章介绍的性能工具能帮助你评估磁盘I/O子系统的使用情况。这些工具可以展示哪些磁盘或分区已被使用&#xff0c;每个磁盘处理了多少I/O,发给这些磁盘的I/O请求要等多久才被处理。 阅读本章后&#xff0c;你将能够&#xff1a; 确定系统内磁盘I/O的总量和类型(读/写…

【网络安全 --- xss-labs通关】xss-labs靶场通关,让你巩固对xss漏洞的理解及绕过技巧和方法(提供资源)

一&#xff0c;资源下载准备 1-1 VMware 16.0 安装请参考以下博客&#xff0c;若已经安装请忽略&#xff1a; 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;…

序列化和反序列化指令在PLC通信上的应用

在了解本篇博客之前&#xff0c;大家可以熟悉下序列化指令的相关介绍&#xff0c;详细内容如下&#xff1a; 博途PLC 1200/1500 PLC 序列化和反序列化指令编程应用_博图序列化和反序列化-CSDN博客序列化最重要的作用&#xff1a;在传递和保存对象时.保证对象的完整性和可传递性…

【API篇】四、Flink物理分区算子API

文章目录 1、 分区算子&#xff1a;随机分区2、分区算子&#xff1a;轮询分区3、分区算子&#xff1a;重缩放分区4、分区算子&#xff1a;广播5、分区算子&#xff1a;全局分区6、自定义分区 重分区&#xff0c;即数据"洗牌"&#xff0c;将数据分配到下游算子的并行子…

Apache Shiro 组件反序列化漏洞分析

概述 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 它的原理比较简单&#xff1a;为了让浏览器或服务器重启后用户不丢失…

嵌入式实时操作系统的设计与开发 (中断管理)

中断发生及响应 硬件抽象HAL层响应 中断请求IRQ被中断控制器汇集成中断向量&#xff08;Interrupt Vector&#xff09;&#xff0c;每个中断向量对应一个中断服务程序ISR&#xff0c;中断向量存放了ISRs的入口地址或ISRs的第一条指令。 系统中通常包含多个中断向量&#xff0…

Linux-ssh

文章目录 远程登录服务器配置远程服务器相关信息创建config文件配置config文件 配置密钥登陆先创建密钥配置密钥文件 执行命令scp传文件copy文件copy文件夹配置我们的vim和tmux 远程登录服务器 ssh userhostnameuser:用户名hostname&#xff1a;IP地址或域名 第一次登陆会显示…

Linux权限基础知识

前言&#xff1a;作者也是初学Linux&#xff0c;可能总结的还不是很到位 Linux修炼功法&#xff1a;初阶功法 ♈️今日夜电波&#xff1a;修炼爱情 —林俊杰 0:30━━━━━━️&#x1f49f;──────── 4:47 …