linux下有很多指令。当我们使用ls -l的时候,可以查看文件的信息,不止有文件名,还有文件元数据。
[root@dreame ~]# ls -l
总用量 48
-rwxr-xr-x 1 root root 8512 3月 30 15:13 a.out
drwxr-xr-x 2 root root 4096 3月 30 15:36 Desktop
drwxr-xr-x 2 root root 4096 3月 30 15:36 Documents
drwxr-xr-x 3 root root 4096 4月 15 12:55 Downloads
drwxr-xr-x 2 root root 4096 3月 30 15:36 Music
drwxr-xr-x 2 root root 4096 3月 30 15:36 Pictures
drwxr-xr-x 2 root root 4096 3月 30 15:36 Public
drwxr-xr-x 2 root root 4096 3月 30 15:36 Templates
-rw-r--r-- 1 root root 74 3月 30 15:13 test.c
drwxr-xr-x 2 root root 4096 3月 30 15:36 Videos
每行包含七列:
(1)模式
(2)硬链接数
(3)文件所有者
(4)组
(5)大小
(6)最后修改时间
(7)文件名
我们看看ls的工作原理:
ls -l读取储存在磁盘上的文件信息,然后显示出来,除了ll其实还有一个stat命令也可以查案到更多信息
[root@dreame ~]# stat a.out
文件:"a.out"
大小:8512 块:24 IO 块:4096 普通文件
设备:fd01h/64769d Inode:132538 硬链接:1
权限:(0755/-rwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2018-03-30 15:13:49.062068097 +0800
最近更改:2018-03-30 15:13:47.608068097 +0800
最近改动:2018-03-30 15:13:47.608068097 +0800
创建时间:-
3.记录分配情况
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布记录了上述块列表
4.添加文件名到目录
内核新的文件名入口即inode和文件名一起添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。
硬链接
由此发现,真正找到磁盘上文件的并不是文件名,而是inode。不过在linux中可以让多个文件名对应于同一个inode。
syf@dreame csdn]$ touch abc
[syf@dreame csdn]$ ln abc def
[syf@dreame csdn]$ ls -li abc def
533674 -rw-rw-r-- 2 syf syf 0 4月 21 19:57 abc
533674 -rw-rw-r-- 2 syf syf 0 4月 21 19:57 def
abc和def的连接状态完全相同,他们被指向文件的硬链接。内核记录了这个链接数,inode533674的硬链接数为2.
如果是删除文件,只需要干两件事:1.在目录中讲对应的记录删除,2.将硬链接数-1,如果为0,则将对应的磁盘释放。
软链接
硬链接是通过inode引用另一个文件,软链接是通过名字引用另外一个文件
[syf@dreame csdn]$ ln -s abc abc.s
[syf@dreame csdn]$ ll
总用量 28
-rw-rw-r-- 2 syf syf 0 4月 21 20:01 abc
lrwxrwxrwx 1 syf syf 3 4月 21 20:02 abc.s -> abc
-rwxrwxr-x 1 syf syf 8808 4月 21 11:11 a.out
-rw-rw-r-- 2 syf syf 0 4月 21 20:01 def
[syf@dreame csdn]$ stat abc
文件:"abc"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd01h/64769d Inode:533674 硬链接:2
权限:(0664/-rw-rw-r--) Uid:( 1000/ syf) Gid:( 1000/ syf)
最近访问:2018-04-21 19:57:19.019077321 +0800
最近更改:2018-04-21 20:01:27.238089161 +0800
最近改动:2018-04-21 20:01:27.238089161 +0800
创建时间:-
acm:
Access:最后访问时间
Mondify:文件内容最后修改时间
Change:属性最后修改时间
动态库和静态库
静态库(.a):程序在编译连接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
动态库(.so):程序在运行的时候才去链接动态库的代码。多个程序共享使用库的代码。
生成静态库
[syf@dreame static]$ ar -rc libmath.a add.o sub.o
[syf@dreame static]$ ls
add.c add.h add.o libmath.a sub.c sub.h sub.o
syf@dreame test]$ gcc -o main main.c -L. -lmath
编译选项:
l:链接库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径
生成动态库
[root@dreame so]# ls
add.c add.h sub.c sub.h
[root@dreame so]# gcc -fPIC -c sub.c add.c
[root@dreame so]# ls
add.c add.h add.o sub.c sub.h sub.o
[root@dreame so]# gcc -shared -o libmymath.so *.o
编译选项:
l:链接动态库库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径
运行动态库:
1、拷贝.so文件到系统共享路径下,一般指/usr/lib
2、更改LD_LIBRARY_PATH