一、目录操作函数
opendir
函数原型:DIR *opendir(const char *name);
函数参数:name:目录名
返回值:返回一个指向该目录操作的流指针
readdir
函数原型:struct dirent *readdir(DIR *dirp);
函数参数:dirp:目录流指针
返回值:返回结构体指针,读取完毕返回NULLstruct dirent {ino_t d_ino; /* 索引节点号 */off_t d_off; /* 在目录文件中的偏移 */unsigned short d_reclen; /* 文件名长度 */unsigned char d_type; /* 文件类型 */char d_name[256]; /* 文件名 */};
closedir
int closedir(DIR *dirp);
打开当前目录下的所有文件:
通过opendir代开一个目录的绝对路径,随后readdir函数不断获取下一个目录项,如果返回的结构体类型指针为NULL时说明已经读取完目录中的所有相然后输出
stat
函数原型:int stat(const char *pathname, struct stat *statbuf);
函数参数:pathnam:文件路径statbuf:文件属性结构体
返回值:成功返回0,失败返回-1struct stat {dev_t st_dev; /* 文件所在设备的ID */ino_t st_ino; /* Inode编号 */mode_t st_mode; /* 文件模式 */nlink_t st_nlink; /* 链接数 */uid_t st_uid; /* 用户ID */gid_t st_gid; /* 组ID */dev_t st_rdev; /* 设备号 */off_t st_size; /* 文件大小 */blksize_t st_blksize; /* 文件存储的块大小 */blkcnt_t st_blocks; /* 文件所占块数*/struct timespec st_atim; /* 最后访问的时间 */struct timespec st_mtim; /* 最后修改的时间 */struct timespec st_ctim; /* 最后改变状态的时间 */#define st_atime st_atim.tv_sec #define st_mtime st_mtim.tv_sec#define st_ctime st_ctim.tv_sec};
getpwuid
getgrgid
利用目录函数实现ls-l的效果
默认为当前目录并打开它,返回一个目录流指针赋值给dp
man 7 inode查找宏函数
查看当前文件下的字目录的权限需要写9个
二、静态库
优点:程序在运行时与函数库再无瓜葛,移植方便
缺点:浪费空间和资源,因为所有相关的对象文件与牵涉到的函数库被链接合成一个可执行文件
制作静态库
1.将.c文件编译成.o文件 gcc -c *.c
2.将.o文件做成静态库 ar crs lib库名.a *.o
使用静态库
gcc main.c -L库路径 -l库名
先分别定义两个.c .h文件
制作动态库
1.将.c文件编译成.o文件 gcc -fPIC -Wall -c *.c
2.将.o文件做成动态库 gcc -shared -o libmyfunc.so *.o
使用动态库
1.编译源码 gcc main.c -L. -lmyfunc
2.运行程序前将库放在能找到的路径下
(1) 把库拷贝到/usr/lib和/lib目录下。
(2) 在LD_LIBRARY_PATH环境变量中加上库所在路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hqyj/share_lib
(3) 添加/etc/ld.so.conf.d/*.conf文件,把库所在的路径加到文件末尾,并执行ldconfig 刷新, 这样,加入的目录下的所有库文件都可见。
-fPIC 创建与地址无关的编译程序