【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接

目录

  • 1.重定向
    • 1.1重定向原理:
    • 1.2重定向接口
  • 2.动态库
    • 2.1生成动态库
    • 2.2使用动态库
  • 3.静态库
    • 3.1生成静态库
    • 3.2使用静态库
  • 4.文件系统
    • 4.1ext2文件系统
    • 4.2文件的存储
    • 4.3文件的获取
  • 5.软连接
  • 6.硬连接

1.重定向

重定向分为两种:

  1. 清空重定向>:重定向到文件中,先清空文件中内容
  2. 追加重定向>>:向文件中追加内容

比如说在bash中将一串字符重定向到文件中。

在这里插入图片描述

1.1重定向原理:

重定向实际上是更改了标准输出文件描述符的指向,让其标准输出指向另外一个文件描述符。

原理如图:凡是往标准输出中写的内容,都写到了newfile中
【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第1张图片

1.2重定向接口

#include
int dup2(int oldfd, int newfd)

操作步骤:

  1. 关闭newfd,关闭成功走2,关闭失败则重定向失败
  2. newfd拷贝oldfd

例:标准输出被重定向了dup_test文件中。
【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第2张图片
 
 
 

2.动态库

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

两个命令:

ldd [可执行程序],查看当前程序依赖的动态库文件
file [可执行文件],可查看文件的属性

【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第3张图片

2.1生成动态库

  1. 编译动态库的源码文件中不能出现main函数
  2. gcc -shared -fPIC 文件名 -o libfuc.sofuc称之为动态库的名字,前缀:lib,后缀:.so
    【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第4张图片
    在这里插入图片描述

2.2使用动态库

  1. 包含动态库的头文件
    【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第5张图片

  2. 指定链接动态库所在的路径:-L [路径]
    在这里插入图片描述

  3. 指定链接动态库的名字:-L [库名称、去掉lib和so]
    【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第6张图片

编译可执行程序的时候,一定要告诉编译器,我们链接的是哪个动态库。

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

3.静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。
windows下静态库后缀为.lib,动态库后缀为.dll。

3.1生成静态库

  1. ar -rc libfuc.a 依赖的文件fuc:静态库的名称,依赖的文件必须是.o文件
    【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第7张图片

3.2使用静态库

  1. gcc 文件名 -L 路径 -lfunc
    在这里插入图片描述
    在这里插入图片描述
    若未使用-static时,则一定为动态链接。

 
 
 

4.文件系统

磁盘是一种顺序的存储介质,但是顺序存储方式会导致磁盘的利用率的问题,产生磁盘碎片。

所以采用离散式存储会提高程序对磁盘的利用率。

目前Linux中最常用的文件系统为:ext2。

4.1ext2文件系统

【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第8张图片
(图源:LinuxC编程一站式学习)

文件系统中存储的最小单位为块(Block),一个块有多大是在格式化时确定的。mke2fs -b可以设置块大小为1024、2048、4096字节。上图中启动块(Boot Block)的大小是确定的,就是1KB,启动块由PC标准决定,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。ext2文件系统将整个分区划分成若干个同样大小的块组(Block Group)。

  • Super Block(超级块):描述整个分区的文件系统信息,例如块大小、文件系统版本号。超级块在每个块组的开头都有一份拷贝。
  • GPT(块组描述符):由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符存储一个块组的描述信息,例如块组从哪里开始是inode表、哪里是数据块、空闲的inode表和数据块还有多少等。在开头也有一份拷贝,这些信息十分重要。
  • Block Bitmap(块位图):本质上是一个位图,每一个比特位表示Data blocks当中块的使用情况,为1表示占用,为0表示空闲。
  • inode Bitmap(inode 位图):每个比特位表示一个inode是否空闲可用。
  • inode Table(inode 表):每个文件都有一个inode,一个块组的所有inode组成了inode表。inode表占多少个块在格式化时就要决定并写入块组描述符。mke2fs默认策略是一个块组有多少个8KB就分配多少个inode。
  • 数据块:存放文件内容

4.2文件的存储

  1. 在Block Bitmap区域查找空闲的Data block块,将文件存储在空闲的Data block块当中。
  2. 通过inode Bitmap获取空闲的inode节点,通过inode节点去描述文件在Data Block区域当中存储位置。
  3. inode+文件名称被作为目录的目录项保存下来

4.3文件的获取

  1. 通过文件名称和inode节点号找到inode对应的文件信息
  2. 在Data Block区域获取当前文件存储的内容,再进行拼接,拼接完成之后就是文件内容了。

 
 
 

5.软连接

软连接:相当于文件的一个快捷方式(别名)

  1. 生成软连接文件:ln -s [源文件] [软连接文件]
  2. 不同inode节点
  3. 保存的信息是相同的
  4. 在删除软连接文件或软连接文件指向的源文件的时候,一定要将二者都删除掉。

【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第9张图片

【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第10张图片
 
 
 

6.硬连接

硬连接:通过inode引用另外一个文件。

  1. ln 源文件 生成的硬连接文件
  2. inode节点一模一样
  3. 两者除名称不一样,其余都一样

【Linux】详谈重定向原理、动态库和静态库的使用、文件系统、软硬链接_第11张图片

删除文件时干了两件事情:①将inode表中对应的记录删除掉,②硬连接数-1,如果为0,则将对应的磁盘空间释放。

你可能感兴趣的:(linux学习,linux,重定向,动态库和静态库,文件,软硬链接)