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

news2025/7/19 19:11:30

目录

一,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和数据块。
  • 硬链接只能链接文件,不能链接目录。
  • 硬链接不能跨文件系统。

 

注意:

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

问:我们在创建一个空目录时,引用计数器为什么是  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.o
  3 
  4 my_lib.o:my_lib.cc
  5   g++ -c -std=c++11 -o $@ $^
  6 my_print.o:my_print.cc 
  7   g++ -c -std=c++11 -o $@ $^
  8 
  9 .PHONY:publish
 10 publish:
 11   mkdir -p publish/include
 12   mkdir -p publish/lib 
 13   cp -rf *.h ./publish/include 
 14   cp -rf *.a ./publish/lib
 15 
 16 
 17 .PHONY:clean
 18 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.o
  6   g++ -std=c++11 -shared -o  $@ $^
  7 
  8 my_print_d.o: my_print.cc
  9   g++ -std=c++11 -fPIC -c -o $@ $^
 10 my_lib_d.o: my_lib.cc
 11   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.coloradmin.cn/o/1102605.html

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

相关文章

企业有了BI,为什么还需要以指标为核心的ABI平台?

#01 企业对BI期望越高 失望越大&#xff1f; — BI&#xff08;Business Intelligence&#xff0c;商业智能&#xff09;历经多年发展&#xff0c;已经被中国企业所熟知。 随着信息化的发展&#xff0c;企业越发希望决策有理有据&#xff0c;而不是拍脑袋就决定。这样产生的…

Godot 官方2D C#重构(1):

前言 Godot 官方 教程 Godot 2d 官方案例C#重构 专栏 Godot 2d 重构 github地址 实现效果 难点介绍 Godot GDScript和C# 对应关系大部分靠猜 文件导入 资源地址&#xff1a;默认为res://开头2D贴图导入类型&#xff1a;Texture2D public Texture2D Bullet_Image new Textu…

【Java基础面试十三】、面向对象的三大特征是什么?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;面向对象的三大特征是什…

【Java基础面试十二】、说一说你对面向对象的理解

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a; 说一说你对面向对象的理…

微查系统,一站式查询,让您的查询更加便捷

微查系统是挖数据一款功能强大的查询系统&#xff0c;是一个集多种查询和核验工具于一身的综合性平台。它可以大大简化企业和个人的查询流程&#xff0c;节省时间和成本&#xff0c;提高查询的准确性和效率。本文将介绍微查系统的主要特点&#xff0c;功能和使用方法&#xff0…

CSS如何画出平行四边形

其实如果项目中有这样的画图 还是会用到的比如 看起来样子怪怪的 哈哈 但是确实可以完成一些需求哈哈哈 这个就要用到一个css3转换的一个 属性了 skew 让一个元素再平面上进行倾斜 div {width: 200px;height: 50px;background-color: #f00;transform: skew(20deg);margin: 100…

AI绘画提示词全攻略,让你所想即所画!(附12000+图片提示词库)

这可能是你从来没有见过的生产模式。 提示词又成为魔法、咒语&#xff0c;在AI时代&#xff0c;掌握了提示词&#xff0c;你可以在一分钟之内写一篇文章&#xff0c;做一首歌曲&#xff0c;生成一张精致的图片。 基础原理 大多数人用不好提示词的根本原因是他没有理解提示词…

Tips linux如何获取当前连接的ssh用户信息

linux ubuntu debian如何获取当前连接的ssh用户信息 这里需要用到一个常用的网络工具netstat&#xff0c;如果没有这个软件可以通过下边的命令安装&#xff1a; sudo apt-get install net-tools安装完成后通过下边的指令获取ssh所有连接用户&#xff1a; netstat -al|grep s…

主流压力测试工具推荐

在产品研发过程中&#xff0c;常常会混淆压力/负载/性能测试这三者之间的区别&#xff0c;这三种测试到底有什么不同呢&#xff1f; 压力测试&#xff08;StressTesting&#xff09;&#xff0c;也称为强度测试&#xff0c;通过模拟实际应用的软硬件环境及用户使用过程的系统负…

emqx broker安装

emqx broker安装 Emq x百万级开源 MQTT 消息服务器 是基于 Erlang/OTP 语言平台开发 一款完全开源&#xff0c;高可用低时延的百万级分布式物联网 MQTT 5.0 消息服务器 官方地址: https://www.emqx.com/zh Centos7 安装 #下载Centos7 amd64位版本 wget https://www.emqx.c…

Android MediaCodec将h264实时视频流数据解码为yuv,并转换yuv的颜色格式为nv21

初始化mediacodec //宽高根据摄像头分辨率设置private int Width 1280;private int Height 720;private MediaCodec mediaCodec;private ByteBuffer[] inputBuffers;private void initMediaCodec(Surface surface) {try {Log.d(TAG, "onGetNetVideoData: ");//创建…

Bootstrap的进度条效果

在Bootstrap中&#xff0c;进度条一般由嵌套的两层结构标签构成&#xff0c;外层标签引入类progress&#xff0c;用来形成进度槽&#xff1b;内层标签引入类progress-bar&#xff0c;用来设计进度条。 目录 01-最基本的进度条效果02-为进度条添加文本03-设置进度条的高度04-设…

【c语言】编译链接--详解

文章目录 一.程序的翻译环境和运行环境二.翻译环境&#xff1a;预编译编译汇编链接&#xff08;一&#xff09;预编译&#xff08;二&#xff09;编译1&#xff09;词法分析2&#xff09;语法分析3&#xff09;语义分析 &#xff08;三&#xff09;汇编(四&#xff09;链接1.编…

FDTD Solutions笔记

FDTD Solutions笔记 目录使用流程实例 目录 使用流程 实例 材料条件 步骤 基底 2. 添加规则膜层 3. 添加仿真区 解释&#xff1a; 仿真区为&#xff08;0,0&#xff09;&#xff0c;x方向为0.4&#xff0c;y方向是1 解释&#xff1a; 一般先用低精度进行计算 解释&#xff1a…

【汇编语言特别篇】DOSBox及常用汇编工具的详细安装教程

文章目录 &#x1f4cb;前言一. ⛳️dosbox的介绍、下载和安装1.1 &#x1f514;dosbos简介1.2 &#x1f514;dosbox的下载1.2.1 &#x1f47b;方式一&#xff1a;官网下载(推荐)1.2.2 &#x1f47b;方式二&#xff1a;网盘安装包 1.3 &#x1f514;dosbox的安装1.4 &#x1f5…

Git GUI使用笔记

看这个视频 Git GUI基本使用_哔哩哔哩_bilibili 1 下载 Git-2.42.0.2-64Window64位安装包-最新版资源-CSDN文库 安装软件就一路next就可以 2 配置 空白处右键&#xff0c;选择Open Git Bash here &#xff0c;输入下面两行配置信息 git config --global user.name "Y…

OJ第四篇

文章目录 链表分割环形链表有效的括号 链表分割 链接: 链表分割 虽然这个题牛客网中只有C,但是无所谓&#xff0c;我们只要知道C是兼容C的就可以了 至于说这个题的思路&#xff0c;我们就弄两个链表&#xff0c;把小于x的结点放到一个链表中&#xff0c;剩下的放到另一个链表…

excel导出-将后端返回的文件流导出为excel

有的业务场景&#xff0c;需要前端自己将文本流导出为excel有的是后端返回的文本流&#xff0c;有的是调用上传组件后&#xff0c;前端组件生成的文本流&#xff0c;组件上传后点击上传的文件名&#xff0c;要求实现下载功能&#xff0c;这时的导出就需要前端自己处理了 直接上…

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

本心、输入输出、结果 文章目录 百度文心一言 4.0 &#xff1a;如何申请百度文心一言 4.0前言如何申请千帆大模型试用百度文心一言 4.0 主要功能介绍配套发布的十余款AI原生应用插件、API 生态 百度世界大会回顾弘扬爱国精神 百度文心一言 4.0 &#xff1a;如何申请百度文心一言…

ubuntu20.04 nerf开山之作

源码 GitHub - yenchenlin/nerf-pytorch: A PyTorch implementation of NeRF (Neural Radiance Fields) that reproduces the results. 代码的相关解读 NeRF代码解读-相机参数与坐标系变换 - 知乎 原文题目&#xff1a;NeRF: Representing Scenes as Neural Radiance Field…