通过系统提供的宏来判断文件类型:
st_mode & 0170000
S_ISREG(st_mode) 0100000
S_ISDIR(st_mode) 0040000
S_ISCHR(st_mode) 0020000
S_ISBLK(st_mode) 0060000
S_ISFIFO(st_mode) 0010000
S_ISLNK(st_mode) 0120000
S_ISSOCK(st_mode) 0140000
通过系统提供的宏来获取文件访问权限:
S_IRUSR 00400 bit:8
S_IWUSR 00200 7
S_IXUSR 00100 6
S_IRGRP 00040 5
S_IWGRP 00020 4
S_IXGRP 00010 3
S_IROTH 00004 2
S_IWOTH 00002 1
S_IXOTH 00001 0
综合示例
#include <dirent.h> #include <stdio.h> #include <sys/stat.h> int main(){ DIR *dir; struct dirent *dent; struct stat buf; dir = opendir("."); if(dir){ while((dent = readdir(dir)) != NULL){ stat(dent->d_name, &buf); printf("%s %d\n", dent->d_name, (int)buf.st_size); } } return 0; }
程序库
库的基本概念
库是一个二进制文件,包含的代码可被程序调用,事先编译好的,可以复用的代码。
标准C库、数学库、线程库……
库有源码,可下载后编译;也可以直接安装二进制包 /lib 、/usr/lib
在OS上运行的程序基本上都要使用库。使用库可以提高开发效率。
Windows和Linux下库文件的格式不兼容
Linux下包含静态库和共享库
静态库特点
编译(链接)时把静态库中相关代码```复制到``可执行文件中
特点:
程序中已包含代码,运行时不再需要静态库
程序运行时无需加载库,运行速度更快
占用更多磁盘和内存空间
静态库升级后,程序需要重新编译链接
静态库创建
1。确定库中函数的功能、接口
2.编写库源码hello.c
#include <stdio.h>
void hello(void) {
printf(“hello world\n”);
return;
}
3.编译生成目标文件
$ gcc -c hello.c -Wall
4.创建静态库 hello
$ar crs libhello.a hello.o
5.查看库中符号信息
$nm libhello.a
hello.o:
0000000 T hello
U puts
6.编写应用程序test.c
#include <stdio.h>
void hello(void);
int main() {
hello();
return 0;
}
7.编译test.c 并链接静态库libhello.a
$ gcc -o test test.c -L. -lhello
$ ./test
hello world
共享库
编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码
程序不包含库中代码,尺寸小
多个程序可共享同一个库
程序运行时需要加载库
库升级方便,无需重新编译程序
使用更加广泛
共享库创建
1.确定库中函数的功能、接口
2.编写库源码hello.c bye.c
#include <stdio.h>
void hello(void) {
printf(“hello world\n”);
return;
}
3.编译生成目标文件
$ gcc -c -fPIC hello.c bye.c -Wall
4.创建共享库 common
$ gcc -shared -o libcommon.so.1 hello.o bye.o
5.为共享库文件创建链接文件
$ ln -s libcommon.so.1 libcommon.so
6.符号链接文件命名规则
lib<库名>.so
7.编写应用程序test.c
#include <stdio.h>
#include “common.h”
int main() {
hello();
bye();
return 0;
}
8.编译test.c 并链接共享库libcommon.so
$ gcc -o test test.c -L. -lcommon
共享库使用
执行程序
./test ./test: error while loading shared libraries: libcommon.so cannot open shared object file : No such file or directory
添加共享库的加载路径(环境变量)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./test hello world bye!
把库拷贝到/usr/lib和/lib目录下(极度不推荐)
在LD_LIBRARY_PATH环境变量中添加库所在路径
添加/etc/ld.so.conf.d/*.conf文件,执行ldconfig刷新
写在最后
文件IO今日完结,我尽量一天一更,大家和我一起变强呀!明天开始进入多线程编程的一章!最后三连即可提高学习效率!!!
另外我在更新的就是算法笔记的一些例题笔记,这个系列是用于提高我的算法能力,如果有兴趣对算法领域感兴趣找不到合适的入门文章也可以追更,如果我更新的太慢了请大家点赞收藏,一键三连才能更有更新的动力呀0.0