Linux_文件系统

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
创建时间:-


这里我们要了解一下inode超级块:存放文件本身的结构信息
i节点表:存放文件属性,如 文件大小,所有者,最近修改时间等
数据区:存放文件内容
将属性和数据分开存放的想法看起来很简单,但实际上是工作方式确实很使用的,如下

删除文件比复制文件快,因为直接从位图里抹去相应比特位
创建一个新文件主要有一下4个操作:
1.储存属性   
内核先找到一个空闲的节点,内核把文件记录到其中
2.存储数据 
该文件需要储存三个磁盘块,内核找到了三个空闲块,300,500,800,将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。

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

猜你喜欢

转载自blog.csdn.net/qq_40425540/article/details/80027789