基础IO(下):软硬链接和动静态库

"没有什么轻松,只有那个未抵达的彼岸" 


 (1)理解文件系统

①inode:

在进程章节,我们知道。系统会创建多个进程,就需要进行管理。

管理的六字真言: 先描述 再组织 

每个进程都有对应的pid,方便操作系统管理自己。

那么相对于文件而言,你能在不同目录,却能创建同一名字的文件。本质上,这些文件的不仅仅是依靠文件名作为标识。而是隐藏的 inode。

inode 就 类似于 进程的 pid 

ls -l -i //带上-i 选项 查看 文件的inode

 那么inode 的数字是从何而来呢?

 

②磁盘区划:

磁盘是典型的块设备,且几乎是唯一的机械设备。


磁盘存储分区:

分区作用
超级块( Super Block
记录的信息主要有: bolck inode 的总量, 未使用的block inode 的数量,一个 block inode 的大小,最
块组描述符(GDT)
描述块组属性信息
块位图(Block Bitmap)
记录Data block哪块数据被占用 哪块数据没被占用
inode位图( inode Bitmap)
每个 bit 表示一个 inode 是否空闲可用
inode table文件原信息
Data block数据区

 


(2)软硬链接:

①如何理解硬链接?

我们知道,磁盘上的真正文件不是文件名,而是inode。 然而在linux下,多个文件名可以对应同一inode。

ln +目标文件 +当前文件 // 硬链接
ln + (-s)             //软连接

软硬链接最根本的区别在于:

硬链接不会生成新的inode,也就不是一个独立的文件。

软链接会新成 新的 inode  ,是一个独立的文件。

我们分别删除 软硬链接的 原文件:

原文件被 “干掉”:

软链接的 文件不能继续使用了。

硬链接 文件却可以继续使用。 

 

②inode中的ref

struct inode
{
  int ret; //引用计数
}

 

在dy目录里另外创建class 目录后: 

 

 也就是说,硬连接属性 是在包括“."    "..”,当在目录内另创建 class。

 

③ACM文件时间;

stat  + 文件名

Access;最后访问时间

Modify;文件最后修改时间

Change;属性修改时间 


(3)动静态库: 

①动静态库

linux下

静态库; .a

动态库; .so

win下;

动态库:.dll

静态库: .lib

 

②动静态库特征:


 

静态:

①静态库链接因为 在编译时,需要把代码全部加载进内存中。占用空间很大(内存+磁盘)

②调用同一静态库时,会出现重复代码。代码冗余。

动态:

依赖动态库。没有库就无法使用库内容。

③如何制作动静态库?

静态库:

我们制作动静态库,只需要把头文件、.o文件打包就行。

   //Makefile 
   //mylib 是 libcal.a的别名
   //CC 是gcc的别名
   mylib=libcal.a
   CC=gcc
   
   //编译mylib 也就是 libcal.a
   $(mylib):add.o sub.o
     ar -rc $(mylib) $^    //这里是必须要的!!!
  
  //%. 通配符
   %.o:%.c  
     $(CC) -c  $<
                
.PHONY:clean
clean:
   rm -rf $(mylib) *.o
   rm -rf mathlib


//创建目录 并把编译好的.o .h 拷贝目录里
.PHONY:output
output:
   mkdir -p mathlib/lib
   mkdir -p mathlib/include
   cp *.h mathlib/include
   cp *.a mathlib/lib

 我们需要的就是 把mathlib 丢给别人就行。

 此时我们对 文件进行编译。发现无法找到<add.h>的头文件。

这很好理解。

编译器只能再默认路径下去查找。

//编译

gcc +(mytest.c) -I 头文件  -L 库路径 -l 具体库

我们生成也就是静态库了。


动态库:

同静态库如出一辙;

但编译.c \.so文件;

//.c  -> .o
gcc -fPIC

//.o -> libcal.so
gcc -shared

.o生成 

 libcal.so

 

我们对文件编译成功了 但为什么运行不起来呢?! 

 

根本上,编译和执行是分离的,一个是交给编译器,另一个是交给操作系统

我们只告诉了编译器 这个mytest.c的库文件在哪里。 但是 当文件运行起来变成进时,操作系统是找不到库文件的!!

 

导入环境变量:


echo$ LD_LIBRARY_PATH:系统库默认路径



export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:+库的绝对路径

 导入前:

 

导入后,执行了。 

 


总结:

①inode作为文件标识符。可以被多个文件同时指向。

②软链接会创建新的inode 反而 硬链接则不会

③静态库制作:

ar -rc 

-I -L -l

④动态库制作:

-fPIC

-shared

-l


本篇就到此结束了~

感谢你的阅读。

祝你好运~ 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值