在Linux下,我们要查看文件信息可以使用ls -l命令
[rlh@localhost ~]$ ls -l
总用量 14440
drwxr-xr-x. 2 root root 25 4月 17 21:42 bit
drwxr-xr-x. 2 rlh rlh 6 3月 29 22:02 Desktop
drwxr-xr-x. 2 rlh rlh 6 3月 29 22:02 Documents
drwxr-xr-x. 2 rlh rlh 6 3月 29 22:02 Downloads
-rw-rw-r--. 1 rlh rlh 14772022 3月 29 22:20 master.zip
drwxr-xr-x. 2 rlh rlh 6 3月 29 22:02 Music
drwxr-xr-x. 2 rlh rlh 52 4月 17 22:06 Pictures
drwxr-xr-x. 2 rlh rlh 6 3月 29 22:02 Public
-rw-rw-r--. 1 rlh rlh 975 4月 1 21:15 Startify
drwxr-xr-x. 2 rlh rlh 6 3月 29 22:02 Templates
drwxrwxr-x. 5 rlh rlh 4096 4月 19 20:06 test
drwxr-xr-x. 2 rlh rlh 6 3月 29 22:02 Videos
drwxrwxr-x. 9 rlh rlh 4096 3月 29 09:29 vim-master
如果要显示某个文件更加详细的信息可以使用stat命令
[rlh@localhost ~]$ stat bit
文件:"bit"
大小:25 块:0 IO 块:4096 目录
设备:803h/2051d Inode:107754522 硬链接:2
权限:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:user_home_t:s0
最近访问:2018-04-18 23:20:57.689729542 -0700
最近更改:2018-04-17 21:42:40.193992598 -0700
最近改动:2018-04-17 21:42:40.193992598 -0700
IO块是IO沟通的基本单元,它是4K。我这使用的的汉语版的,所以需要了解下最后三个信息Access(最近访问时间)Modify(最近更改时间)Change(最近改动时间)
着重需要了解的是inode
在硬盘上,存储文件有三个部分:超级块,i节点表,数据区
数据区:存放文件内容
i节点表:存放文件属性
超级块:存放文件本身的结构信息
其实在三个部分两两之间还存在一个位图(map),如data bit map和indoe bit map,用于更加快捷的查看修改
indoe就是i节点表的一个小格子,存储文件信息,每个文件只有一个indoe号,因此我们要找到一个文件,并不是通过文件名,而是通过indoe来查找。这里又不得不说下硬链接和软链接。
硬链接
ls -l命令所显示信息的第二列,就是硬链接数,硬链接与源文件拥有同一个indoe,就相当于两个文件只是文件名本质上还是同一个文件。
创建硬链接的命令:ln 硬链接 目标文件
目录的硬链接数为2,是因为目录中还有一个..文件,它是返回上一层目录,也就是原目录
删除硬链接,会使硬链接数减一
软链接
软链接就相当于一个快捷方式,它拥有独立的独立的indo号,只是可以更快速的找到目标文件
创建软链接的命令:ln -s 软链接 目标文件名
动态库和静态库
静态库(.a):程序在编译链接时会自动把库的代码链接到可执行文件中,也就是程序会拥有自己独立的一份静态库
动态库(.so):程序运行时采取链接库中文件,也就是动态库是多个文件共享的,它可以节省内存和磁盘的空间
生成静态库命令:ar -rc 以lib开头.o结尾的静态库名 编译链接文件
使用静态库命令:gcc main.c -L -l取出了前缀和后缀的静态库名
生成动态库命令:gcc -fPIC -c sub.c add.c
gcc -shared -o libmymath.so *.o
使用动态库命令:gcc main.o -o main -L. -lhello
L后要加路径
运行动态库:
- 拷贝.so文件到系统共享库路径下,/usr/lib
- 更改LD_LIBRARY_PATH
- ldconfig配置/etc/ld.so.conf.d/,ldconfig更新
实例:
静态库
//add.c
#include "add.h"
int myadd(int x, int y){
return x + y ;
}
//add.h
#ifndef _ADD_H_
#define _ADD_H_
#include <stdio.h>
int myadd(int x, int y);
#endif
//sub.c
#include "sub.h"
int mysub(int x, int y){
return x - y;
}
//sub.h
#ifndef _SUB_H_
#define _SUB_H_
#include <stdio.h>
int mysub(int x, int y);
#endif
//生成的静态库libmymath.a,全为乱码
!<arch>
/ 1524025363 0 0 0 24 `
^@^@^@^B^@^@^@\^@^@^Epmyadd^@mysub^@add.o/ 1524024646 1000 1000 1006
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^X^A
^@^@^@^H^@^@^@^H^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@ ^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@^@
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^X^A
^@^@^@^H^@^@^@^H^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@ ^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@^@
//值给测试代码传了静态库和头文件
#include <stdio.h>
#include "sub.h"
#include "add.h"
int main(){
int x = 10;
int y = 5;
int z = myadd(x, y);
int w = mysub(x, y);
printf("%d , %d\n",z, w);
}
动态库
//add.c
#include "add.h"
int myadd(int x, int y){
return x + y ;
}
//add.h
#ifndef _ADD_H_
#define _ADD_H_
#include <stdio.h>
int myadd(int x, int y);
#endif
//sub.c
#include "sub.h"
int mysub(int x, int y){
return x - y;
}
//sub.h
#ifndef _SUB_H_
#define _SUB_H_
#include <stdio.h>
int mysub(int x, int y);
#endif
//生成的动态库libmymath.so,全为乱码
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^C^@>^@^A^@^@^@?^E^@^@^@^@^@^@@^@^@^@^@^@^@^@H^Q^@^
^@^@^@^M^@^@^@BE???r?^O???|???^O?qX^\???^N???^N^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
^@H??t^E?^[^@^@^@H??^H?^@^@^@^@^@^@?5?
^@?%?
^@^O^_@^@?%?
^@h^@^@^@^@??????%z
^@h^A^@^@^@?????H?^Ex
^@H?=j
^@UH)?H??H??^Nw^B]?H?^E^D
^@H??t?]??^O^_@^@H?^EA
^@H?=:
^@UH)?H??H??^CH??H???H^A?H??u^B]?H?^U? ^@H??t?]H????^O^_@^@?=^A
^@^@u'H?=? ^@^@UH??t^LH?=?^G ^@?]????h???]?^E? ^@^A??^O^_@^@f.^O^_?^@^@^@^
^@^@^@^@^@^@^@?^@^@^@^@^@^@^@^K^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@^C^@^@^@^@^@^@^@^@^
^@^@^@^H^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@x^@^@^@^A^@^@^@^F^@^@^@^@^@^@^@`^E^@^@^@^@
^@?^E^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^K^@?^E^@^@^@^@^@^@^@^@^@^@^@^@^@^@
//测试代码
#include <stdio.h>
#include <math.h>
int main(){
double f = pow(2.0, 3.0);
printf("%f\n", f);
}