访问目录-opendir
opendir函数用来打开一个目录文件:
#include<dirent.h>
DIR *opendir(const char *name);
DIR *fdopendir(int fd);使用文件描述符,要配合open函数使用
- DIR是用来描述一个打开的目录文件的结构体类型
- 成功时返回目录流指针;出错时返回NULL
访问目录-readdir
readdir函数用来读取目录流中的内容:
#include <dirent.h>
struct dirent *readder(DIR *dirp);
- struct dirent 是用来描述目录流中一个目录项的结构体类型;
- 包含成员char d_name[256];
- 成功时返回目录流dirp中下一个目录项;
- 出错或者到末尾时返回NULL
访问目录-closedir
closedir函数用来关闭一个目录文件:
#include <dirent.h>
int closedir(DIR *dirp);
- 成功时返回0;出错时返回EOF。
修改文件访问权限-chmod/fchmod
chmod/fchmod函数用来修改文件的访问权限:
#include <sys/stat.h>
int chmod(const char *path,mode_t mode);
int fchmod(int fd,mode_t mode);
- 成功时返回0;出错时返回EOF;
- root和文件所用者能修改文件的访问权限;
- 示例:chmod("test.txt",0666);
获取文件属性-stat/lstat/fstat
stat/lstat/fstat函数用来获取文件属性:
#include <sys/stat.h>int stat(const char *path,struct stat *buf);
int lstat(const char *path,struct stat *buf);
int fstat(int fd,struct stat *buf);
- 成功时返回0;出错时返回EOF;
- 如果path是符号链接stat获取的是目标文件的属性;而stat获取的是链接文件的属性。
静态库的使用
库的概念:
- 库是一个二进制文件,包含的代码可以被程序调用
- 标准C库、数学库、线程库.....
- 库有源码,可以下载后编译;也可以直接安装二进制包
- /lib /usr/lib
- 库是编译好的可以复用的代码
- 使用库可以提高开发效率
- Windows和Linux下库文件的格式不兼容
- Linux下包含静态库和共享库
静态库特点:
- 编译链接时把静态库中相关代码复制到可执行文件中
- 程序中已经包含代码,运行时不再需要静态库
- 程序运行时无需加载库,运行速度更快
- 占用更多磁盘和内存空间
- 静态库升级后,程序需要重新编译链接
静态库创建和使用过程:
- 确定库中函数的功能、接口
- 编写库源代码
- 编译生成目标文件$gcc -c hello.c -Wall生成hello.o
- $ar -rsv libhello.a hello.o
- $gcc -o test test.c -L. -lhello
ar参数:
c:禁止在创建库时产生的正常信息
r:如果指定的文件已经存在于库中,则代替它
s:无论ar命令是否修改了库内容都强制重新生成库符号表
v:将建立新库的详细的逐个文件的描述写至标准输出
q:将指定的文件添加到库的末尾
t;将库的目标写至标准输出
注意:
1.静态库名字要以lib开头,后缀名为.a
2.没有main函数的.c文件不能生成可执行文件
动态库(共享库)
共享库特点:
- 编译链接时仅记录用到哪一个共享库中的哪一个符号,不复制共享库中相关代码
- 程序不包含库中代码,尺寸小
- 多个程序可以共享同一个库
- 程序运行时需要加载库
- 库升级方便,不需要重新编译程序
- 使用更广泛
共享库的创建与使用过程:
1.确定库中函数的功能、接口
2.编写库源代码
3.编译生成目标文件$gcc -c -fPIC xx.c xxx.c ....-Wall生成xx.o和xxx.o....
4.gcc -shared -o libxxxxx.so xx.o xxx.o ....
5.gcc -o test test.c -L. -lxxxxx
-fPIC:生成与位置无关的代码
让系统能找到要加载的共享库,有三种方法:
1.把库文件拷贝到/usr/lib和/lib目录下
2.在LD_LIBRARY_PATH环境变量中添加库所在路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库目录
或者添加在~/.bashrc文件里面,$source ~/.bashrc生效
3.添加/etc/ld.so.conf.d/libxxx.conf文件,执行ldconfig刷新
ldd:
$ldd 可执行文件名称
可以查看可执行文件使用的动态库