文件属性:(fstat stat lstat)
用于查看文件属性,与stat和lstat不同,fstat需要先打开文件才可以进行文件属性的查看
以上三个函数的返回值:成功返回0,失败则返回-1,并且将errno设置为一个恰当的值
虽然lstat与stat相似,但是lstat能返回符号链接,这是stat办不到的。
在使用函数的时候应先声明结构体和判断:
若要打印属性,应先了解一下struct stat:
st_dev:描述文件所在设备的标识,通过major()和minor()得出,使用%d输出;
st_ino:文件的结点号,使用%d输出;
st_mode:可输出文件的类型与权限;
文件类型可通过参看man手册,使用switch语句进行输出:
文件权限通过与运算可得出八进制:
st_nlink:硬链接的个数(一个文件可有多个名字,且删除一部分文件名字是不能删除整个文件的,这就是硬链接)可通过ln命令建立硬链接,说到硬链接当然也会有软链接(一种类似于windows中的快捷方式一样的东西有文件名,有属性,且内容为另一个链接文件的文件名,指向那个文件,符号链接就是软连接);
st_uid:文件用户标识,使用%d输出;
st_gid:文件用户组标识,使用%d输出;
st_size:文件的大小,以字节单位,使用%d输出;
st_blksize:块大小,一般为4k;
st_blocks:分配给文件的块的数量,512字节为单元;
st_atime:最后访问时间;
st_ctime:最后修改文件属性的时间;
st_mtime:最后修改文件内容的时间;
一下将通过程序一部分来说明:
输出为:
目录操作opendir closedir readdir
上述三个命令通过程序来解释:
程序实现了一个简单的ls功能,输出结果为:
库
库是什么,说白了,库就是 *.o 文件的集合。库分为静态库和动态库。
静态库:
优点:程序在运行的与函数库没有关系,一直非常方便;
缺点:①浪费磁盘的空间;②浪费了内存。
打包一个静态库:
ar crs libxxxx.a *.o
例如:在已有hello.o文件的前提下(若没有,需使用gcc -c生成.o文件),输入以下语句:
ar crs libmyhello.a hello
链接一个库: gcc -o main main.c libmyhello.a
运行./main便可看到结果是合理的
动态库:
又称共享库,顾名思义及时将库共享,共享的方式是使用索引,并不会真正地链接。就像这样:
创建动态库:
①建立与位置无关的代码: gcc -fPIC -Wall -c hello.c (fPIC:position independent code)
②建立共享:gcc -shared -o libmyhello.so hello.o
③解决路径问题:方法一:将库拷贝到/usr/lib目录下(强迫症玩家不建议这么操作),拷贝前请注意自己是root用户。cp libmylib.so /usr/lib
方法二:在环境变量中加入库的路径:export LD_LIBRARY_PATH=.
方法三:添加/etc/ld.so.conf.d*.conf文件
这样之后在进行连接就不会有问题了:gcc -o main main.c libmehello.so
也可以写作:gcc -o main main.c -lmyhello -l