【1】目录文件操作函数
-
opendir
、closedir
、readdir
-
DIR *opendir(const char *name);
功能:打开目录
参数:
name:目录名
返回值:成功:目录流指针
失败:NULL 更新errno -
int closedir(DIR *dirp);
功能:关闭目录
参数:
dirp:目录流指针
返回值:成功:0
失败:-1 更新errno -
struct dirent *readdir(DIR *dirp);
功能:读目录文件
参数:
dirp:目录流指针
返回值:成功返回的保存文件信息的结构体地址
失败或读到目录文件结尾:NULL 更新errno
-
struct dirent {
ino_t d_ino; /* 文件inode */
off_t d_off; /* 下一个文件的偏移指针 */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all file system types */
char d_name[256]; /* 文件名 */
};
【2】库
-
库
库是一种可执行代码的二进制形式。
通俗讲就是把一些常用函数的目标文件打包在一起,提供相应
函数的接口,便于程序员使用;它可以被操作系统载入内存执行。
由于windows和linux的本质不同,因此二者库的二进制是不兼容的
分为:动态库和静态库
1)静态库:静态库在程序编译时会被连接到目标代码中,
程序运行时将不再需要该静态库,因此可执行文件体积较大。
2)动态库在程序编译时并不会被连接到目标代码中,
而是在程序运行时才被载入,因此在程序运行时还需要动态库
存在,因此代码体积较小动态库 静态库
linux:.so .a
windows:.dll .lib
-
静态库
创建静态库步骤:-
将源文件编译生成目标文件
gcc -c add.c -o add.o
-
创建静态库用ar命令,它将很多.o转换成.a
ar crs libmyadd.a add.o
libmyadd.a
:lib
指库,myadd
是库名,.a
指静态库 -
静态库文件名的命名规范是以lib为前缀,紧接着跟
静态库名,扩展名为.a。使用静态链接库
gcc main.c -L. -lmyadd -o main
-L
:指定链接路径
-l
:链接库
执行./main
-
优缺点:
优点: 程序中已包含代码,运行时不再需要静态库。
运行时无需加载库,运行速度更快。
缺点: 静态库中的代码复制到了程序中,使程序会占更多的磁盘和内存空间
静态库升级后,程序需要重新编译链接
-
-
动态库(共享库)
创建动态库步骤:-
-我们用gcc来创建共享库
gcc -fPIC -c add.c -o add.o
-fPIC
创建与地址无关的编译程序
gcc -shared -o libmyadd.so add.o
-
-编译代码
gcc main.c -L. -lmyadd -o main
ldd main
查看main
的运行依赖那些库。 -
-为了让执行程序顺利找到动态库,有三种方法 :
-
把库拷贝到/usr/lib和/lib目录下。
sudo mv libmyadd.so /usr/lib
-
在LD_LIBRARY_PATH环境变量中加上库所在路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
(最好是绝对路径,要在一行)
(终端关闭,环境变量就没在了)
本次配置只在当前终端有效,关闭和关机后就没效了。
想要永久有效需要到 .bashrc文件中进行修改。生效文件:source .bashrc
-
添加/etc/ld.so.conf.d/*.conf文件,
把库所在的路径加到文件末尾,并执行ldconfig刷新
sudo vi xx.conf
添加动态库存在的路径,如:
/home/linux/DC20111/IO/day3/share
在/etc/ld.so.conf.d
下
执行:sudo ldconfig
生效
-
-
优缺点:
优点: 程序在执行时加载动态库,代码体积小
将一些程序升级变得简单。
不同的应用程序如果调用相同的库,那么在内存
里只需要有一份该共享库的实例。
缺点:运行时还需要动态库的存在,移植性较差
注意:更新静态库,所有的可执行文件需要重新编译
更新动态库,所有的可执行文件不需要重新进行编译,直接执行。 -