如何做网站数据分析,3千元在家办厂,网络舆情监测方案,新人如何做自己的网站#x1f341;你好#xff0c;我是 RO-BERRY #x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 #x1f384;感谢你的陪伴与支持 #xff0c;故事既有了开头#xff0c;就要画上一个完美的句号#xff0c;让我们一起加油 目录 1.理解软硬链接1.1 操作观… 你好我是 RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 感谢你的陪伴与支持 故事既有了开头就要画上一个完美的句号让我们一起加油 目录 1.理解软硬链接1.1 操作观察现象软链接硬链接 1.2 软硬链接的原理测试硬链接测试软链接 1.3 软硬链接的应用场景1.3.1软链接1.3.2 硬链接 2.动静态库2.1 动静态库的制作和使用准备工作生成静态库生成动态库 2.2 将自己的库打包给别人 1.理解软硬链接
软链接和硬链接是在Linux系统中常见的文件链接方式。
软链接Symbolic Link 软链接是一个指向目标文件或目录的特殊文件类似于Windows系统中的快捷方式。软链接可以跨文件系统可以链接到目录也可以链接到文件。软链接的特点是
软链接文件有自己的inode和文件名但是数据块内容是指向目标文件的路径。删除软链接不会影响目标文件。软链接可以跨文件系统即可以链接到不同的磁盘分区。
硬链接Hard Link 硬链接是指多个文件名指向同一个inode它们共享同一份数据块内容。硬链接的特点是
硬链接文件和目标文件具有相同的inode和数据块内容。删除任意一个硬链接文件不会影响其他硬链接文件和目标文件。硬链接只能链接到文件不能链接到目录。硬链接不能跨文件系统即只能在同一个磁盘分区内创建。
1.1 操作观察现象 指令ln -s ln -s是Linux系统中的一个命令用于创建软链接symbolic link。软链接是一种特殊的文件它指向另一个文件或目录。通过软链接可以在不改变原始文件或目录位置的情况下创建一个指向它的链接。 使用ln -s命令创建软链接的语法如下 ln -s 原始文件或目录路径 链接文件路径 其中原始文件或目录路径是要创建链接的文件或目录的路径链接文件路径是要创建的软链接的路径。 例如假设当前目录下有一个文件file.txt我们可以使用以下命令创建一个指向它的软链接 ln -s file.txt link.txt 这样就创建了一个名为link.txt的软链接它指向file.txt文件。
需要注意的是软链接是一个指向原始文件或目录的引用而不是实际的文件或目录本身。删除软链接不会影响原始文件或目录但删除原始文件或目录可能会导致软链接失效。 指令ll -li ll -li是一个Linux命令用于显示文件或目录的详细信息并以inode号进行排序。下面是该命令的一些说明 ll是 “ls -l” 的简写用于显示文件和目录的详细信息。-li是两个选项的组合其中 -l表示以长格式显示文件信息包括文件权限、所有者、大小、修改日期等而 -i表示显示文件的inode号。
通过执行 ll -li 命令您将看到当前目录下所有文件和目录的详细信息并按照inode号进行排序。 软链接
结论软链接本质上就是一个文件有独立的inode 指令ln
在Linux系统中创建文件硬链接可以通过ln命令来创建硬链接。ln命令的语法如下 ln [选项] 源文件或目录 目标文件或目录 其中源文件或目录是要创建链接的文件或目录的路径目标文件或目录是要创建的链接的路径。
创建硬链接的命令格式为 ln 源文件 目标文件 例如要在当前目录下创建一个名为linkfile的硬链接指向源文件sourcefile可以使用以下命令 ln sourcefile linkfile
注意硬链接只能链接到同一个文件系统中的文件且不能链接到目录。 硬链接 我们创建了硬链接之后可以发现。前面的文件信息发生了一个微小的变化也就是文件权限后面的数字由1变成了2而硬链接新出现的文件其初始数字就是2这个数字从来没有讲述过 我们查看一下inode也可以发现新出现的文件与旧文件inode竟然是一样的 结论硬链接本质不是一个独立的文件因为它的inode编号和目标文件相同 1.2 软硬链接的原理
测试硬链接
我们将硬链接的目标文件写入点数据 可以看到我们修改目标文件的同时硬链接生成的文件也会发生变化其大小与目标文件同样是12且修改时间相同inode也没有改变 我们删除目标文件 可以看到我们的硬链接产生的文件并没有什么变化我们查看其文件数据可以清楚的看到这个数据就是我们当初输入到目标文件的数据这是什么情况 其实也可以理解其inode和目标文件是一摸一样的也就是说他们对应的都是同一个文件我们硬链接的工作特别像给目标文件进行一个重命名并且源文件不改变。
硬链接的本质一定没有新建文件因为没有新的inode只是新建了一个文件名与目标文件inode相同的映射关系。 这个时候我们再看当初的这个2 其实这就是一个硬链接数表明有多少个硬链接,表明了有多少个文件名与这一块数据有相同的映射关系同时也叫引用计数
同时可以看到硬链接就是建立了一个映射关系同时对引用计数即可。
我们删掉文件后可以看到引用计数从2变成了1 测试软链接 软链接创建的文件有独立的inode有独立的inode那么就有独立的属性以及独立的数据内容。
软链接本质就是一个独立文件软链接内容里面放的目标文件的路径
软链接就相当于我们Windows里面的快捷方式其存储的就是其可执行程序的路径
1.3 软硬链接的应用场景
1.3.1软链接
我们创建一系列文件并输入内容给test.c #includestdio.h
int main()
{printf(hello world\n);return 0;
}将文件编译并把可执行文件移动到bin目录下 我们想访问这个可执行文件就只能访问绝对路径访问 我们还可以采用软链接的方式访问到这个可执行文件 我们就可以使用软链接的方式在当前目录创建一个软链接的文件这样就可以直接访问到深路径的文件我们使用起来就更加方便 我们也可以采用硬链接的方式来达到访问深路径的文件 软链接使用起来还是更加方便一些一般推荐软链接 系统有很多的软链接
ls -l /lib64/1.3.2 硬链接
我们创建一个普通文件以及一个目录 可以发现普通文件的硬链接数是1而目录一创建出来硬链接数就是2。 我们进入empty目录下 我们可以看到empty目录下有隐藏的点文件我们之前讲过这个就是指的当前目录它的inode与empty目录的inode是一模一样的而它就是除了empty外另一个硬链接。 我们进入empty目录下再创建一个a目录 这里可以看到我们的empty目录的硬链接数变成了3这就是因为我们empty目录里的a目录里有一个自带的点点文件这代表的是上级目录它就是第三个empty目录的硬链接 由此得知一个目录下有多少个子目录硬链接数-2即可计算得到
注意Linux中不允许给目录建立硬链接但是可以建立软链接 2.动静态库 静态库.a程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库 动态库.so程序在运行的时候才去链接动态库的代码多个程序共享使用库的代码。 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表而不是外部函数所在目标文件的整个机器码 在可执行文件开始运行以前外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中这个过程称为动态链接dynamic linking 动态库可以在多个程序间共享所以动态链接使得可执行文件更小节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用节省了内存和磁盘空间。 我们是很经常使用库的我们创建一个普通C文件并编写简单代码 这里就是利用了C语言的库的之前进行简单的讲解过这是C语言的动态库 关于库我们有过一定的使用经验 库分为静态库以及动态库-----大部分的系统默认安装的是动态库云服务器是静态库–(C标准库)默认是没有安装的 默认编译程序用的是动态链接的如果要静态要加-static
库的真实名字lib. XXXX -a/so 去掉前缀以及后缀
2.1 动静态库的制作和使用 一般我们的程序执行会经历几个阶段 a.h a.c --- a.ob.h b.c --- b.oc.h c.c --- c.od.h d.c --- d.o再结合libc.so/libc.a最后main.c ------main.o 库则是不提供.c文件 a.h a.ob.h b.oc.h c.od.h d.o 你只需要将main.c ------main.o 注这里的a、b、c、d只是概念文件 所谓的库就是将所有的.o文件用特定的方式进行打包形成一个文件
库的存在的意义
提高开发效率隐藏源代码 准备工作
在了解库的使用原理后我们来模拟实现一个
创建五个文件 编写文件
add.c
#include add.h
int add(int a, int b)
{return a b;
}
add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a, int b);
#endif // __ADD_H__
sub.h
#ifndef __SUB_H__
#define __SUB_H__
int sub(int a, int b);
#endif // __SUB_Hsub.c
#include add.h
int sub(int a, int b)
{return a - b;
}main.c
#include stdio.h
#include add.h
#include sub.hint main()
{int a 10;int b 20;printf(add(%d, %d)%d\n, a, b, add(a, b));a 100;b 20;printf(sub(%d,%d)%d\n, a, b, sub(a, b));
}生成.o文件
生成静态库 指令ar -rc ar -rc是一个用于创建或更新静态库的命令。它是GNU工具链中的一个工具用于将一组目标文件打包成一个静态库文件。下面是ar -rc命令的一些常见用法
创建静态库可以使用ar -rc命令将多个目标文件打包成一个静态库文件。例如要将文件1.o、文件2.o和文件3.o打包成一个名为libexample.a的静态库可以执行以下命令 ar -rc libexample.a 1.o 2.o 3.o 更新静态库如果已经存在一个静态库文件可以使用ar -rc命令向其中添加新的目标文件或替换已有的目标文件。例如要向名为libexample.a的静态库中添加一个新的目标文件file.o可以执行以下命令 ar -rc libexample.a file.o 替换静态库中的目标文件如果要替换静态库中已有的目标文件可以使用ar -rc命令指定相同的目标文件名。例如要替换名为libexample.a的静态库中的目标文件file.o可以执行以下命令 ar -rc libexample.a file.o 查看静态库内容可以使用ar -t命令来查看静态库中包含的目标文件列表。例如要查看名为libexample.a的静态库中包含的目标文件列表可以执行以下命令 ar -t libexample.a 输入指令ar -rc libmymath.a add.o sub.o生成静态库 查看静态库中的目录列表 ar -tv libmymath.a t:列出静态库中的文件 v:verbose 详细信息 所以库的本质就是把一堆.o打包形成一个文件然后通过头文件来调用库。注意库中不能包含main函数。
编译一下即可运行 gcc 要形成的可执行文件名 main.c所依赖的文件 -L .-L 路径表示myc这个库在哪个路径下-lmymath指明要链接mymath这个静态库 生成动态库 fPIC产生位置无关码在将.c或者.cpp形成.o文件时需要加上-fPIC。要形成动态库必须加上-fPIC。 形成动态库不需要用到其它指令gcc编译器就可以形成动态库只不过要加上-shared命令。 gcc -shared -o libmymath.so名字真正的库名要去掉lib和.sosub.o add.o 所依赖的.o文件 直接使用我们的这个动态库,那么就同样要告诉编译器我们库的名字和所在的路径参考上面静态库路径的写法。 2.2 将自己的库打包给别人
假设在我当前目录下有libmymath.so动态库add.hsub.h两个头文件如果我想将这三个文件一起交给别人就可以把它们打包一起放在一个目录下一起压缩完再交给别人。
Makefile 1 libmymath.so:add.o sub.o2 gcc -shared -o $ $^3 .o:.c4 gcc -shared -c $5 #add.o:add.c6 # gcc -c -fPIC $ -o $7 #sub.o:sub.c8 # gcc -c -fPIC $ -o $9 .PHONY:clean10 clean:11 rm -f *.o libmymath.so12 13 .PHONY:output 14 output:15 mkdir -p ./user/mylib/16 mkdir -p ./user/Headfile/17 cp -rf libmymath.so ./user/mylib/18 cp -rf add.h sub.h ./user/Headfile/19 tar -czf user.tgz user user目录是通过user.tgz解压得到的下面是user目录下的文件 将两个头文件拷贝到usr/include目录下编译器默认会到include目录下去寻找头文件将库文件拷贝到usr/lib目录下编译时指定库链接就能够运行了。