一.目录相关的函数
1. opendir(const char *name):
功能:打开一个目录
参数: name:目录名
返回值:成功返回DIR结构体指针,失败返回NULL置位错误码
2.closedir(DIR *dirp):
功能:关闭目录
参数: dirp:目录的指针
返回值:成功返回0,失败返回-1置位错误码
3.readdirr(DIR *dirp):
功能:读取一个目录下的内容
参数: dirp:opendir时候返回的指针
返回值:成功返回dirent结构体指针,失败返回NULL,置位错误码
例:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
int main(int argc, char const *argv[])
{
//1.判断输入用户的参数的个数
if(argc!=3){
fprintf(stderr,"intput error,try again\n");
fprintf(stderr,"usage: ./a.out filename dirname\n");
return -1;
}
//2.打开一个目录
DIR *dir;
struct dirent *dt;//为了打印文件的相关内容
struct stat st;
int flags=0;
if((dir=opendir(argv[1]))==NULL){
perror("open dir error");
return -1;
}
//3.读取目录下的内容
//readdir成功返回dirent结构体指针
while((dt=readdir(dir))!= NULL){
if(strcmp(dt->d_name,argv[1])==0){
flags=1;
if(stat(dt->d_name,&st)){
perror("stat error");
return -1;
}
printf("filename=%s,type=%#o,ino=%ld,mode=%#o\n",dt->d_name,dt->d_type,dt->d_ino,st.st_mode&0777);
}
//判断是什么类型的文件
switch(dt->d_type){
case DT_BLK:
printf("这是一个块设备文件\n");
break;
case DT_CHR:
printf("这是一个字符设备文件\n");
break;
case DT_FIFO:
printf("这是一个管道文件\n");
break;
case DT_LNK:
printf("这是一个链接文件\n");
break;
case DT_SOCK:
printf("这是一个套接字文件\n");
break;
case DT_REG:
printf("这是一个普通文件\n");
break;
case DT_DIR:
printf("这是一个目录文件\n");
break;
}
}
if(flags==0){
printf("不存在这个文件\n");
}
//4.关闭目录
closedir(dir);
return 0;
}
二.系统中库的制作
编译的.c文件中不能含有main函数
windows中库的格式
xxx.dll: 动态库
xxx.lib: 静态库
Linux的库格式
libxxx.so: 动态库
libxxx.a: 静态库
1.静态库的制作
xxx表示你想封装的.c文件,里边不能包含main函数
编译:gcc -c xxx.c -o xxx.o (只编译不链接)
ar -cr libxxx.a xxx.o (创建一个库文件,-r 将文件中的函数放入到库中)
2.静态库的使用
-L:指定库的路径
-l:指定链接的库的名字
-I:指定头文件的路径
编译:gcc main.c -L . -lxxx -o test -I . //生成test的可执行文件
3.动态库的制作
编译:gcc -fPIC -shared xxx.c -o xxx.so 生成动态库
4.动态库的使用
-L:指定库的路径
-l:指定链接的库的名字
-I:指定头文件的路径
编译:gcc main.c -L . -lxxx -I . -o test//生成test的可执行文件
这里需要注意的是直接编译会报错,因为会找不到库的路径需要通过以下方式之一进行修改
方式一:
export LD_LIBRARY_PATH=.
//告诉系统这个库的路径在当前位置export LD_LIBRARY_PATH记录的环境变量,这种方式只对当前终端生效
方式二:
sudo cp libxxx.so /lib将动态库拷到系统的库的路径下,永久生效
//将动态库拷贝到系统的路径下
方式三:
将动态库的路径放到下边这个文件里边
sudo vi /etc/ld.so.conf.d/libc.conf //修改系统的配置文件
sudo ldconfig //让配置立即生效