linux文件操作-stat
今天 我们重点来讲讲stat这个系统调用(因为在编写中经常用到所以重点提出来讲解)
stat也是一个命令(主要记录文件的一些基本信息)
其实stat也是一个结构体 linux操作系统为了方便,报操作这个结构体的函数 也命名为stat/lstat
首先我们先来看看这个结构体的具体成员
命令的显示效果
由于我的ubuntu安装了中文 大家可以一目了然的看见一些信息的意思。
1.这里主要讲解一下Inode号
Inode号是 每个文件系统区分不同文件的标识,通过遍历目录项得到inode号 来访问inode结点
通过目录项-》inode结点-》文件数据块(我们前面提及到的淘宝分布式存储引擎也是这种相似的原理)
2.硬链接:可以理解成就是通过文件本身来访问文件的内容(也是一种文件)
3.软链接:可以理解成通过一个第三方来间接访问这个文件的内容(就像你要找一个人找不到,但是你可以向第三人打听消息,
这样你就可以找到它了)
4.然后就是 stat结构体中的st_mode数据成员
我们可以通过这个成员来得到文件的权限 或者判断文件是什么类型的 只需要 位运算一下 & 看某个权限是否存在
也可以通过一些定义的宏来判断文件的类型
接下来我们就通过一个简单的demo来使用一下 通过stat是怎么得到文件的信息的
stat/fstat都是相同的道理 就是函数操作文件的方式不一样而已
lstat特殊一些
以上都是把文件的信息存入一个statbuf中
stat(穿透函数-软连接) 如果读取的文件就是软连接根据软连接读取指向的文件信息
lstat(非穿透函数-不追踪)如果读取的文件就是软连接就读取软连接文件的信息(由于软连接也是一种文件)
代码demo:
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
using namespace std;
static int Debug = 1;
int32_t
main(int32_t argc, char* argv[])
{
int32_t fd = open("./tmp", O_RDWR | O_CREAT | O_EXCL, 0644);
if (fd < 0) {
fprintf(stderr, "create file error the reason is %s\n", strerror(errno));
exit(1);
}
ftruncate(fd, 200); // 扩容一下啊
unlink("./tmp"); // 删除这个临时文件 (在进程放弃这个文件使用之后)
int ret = 0;
struct stat statbuf;
if ((ret = fstat(fd, &statbuf)) < 0) {
fprintf(stderr, "stat file error the reason is %s\n", strerror(errno));
}else {
if (S_ISDIR(statbuf.st_mode)) {// 如果这个文件是一个目录
if (Debug)printf("the file is a dir\n");
}
else {
if (Debug)printf("the file is not a dir\n");
printf("the file size : %d\n", statbuf.st_size);
}
}
close(fd);
return 0;
}
效果:
你看并没有创建的文件,因为我们已经在代码中把文件删除了 在close(fd)之后,所以以后对于临时的文件 我们就可以采用这种操作
其实还有很多的关于文件操作的linux的api, 像什么 symlink,link, readlink rename, access等等的都非常的简单
用的时候只需要插一下相关的api就可以了
更多的C/C++ linux编程我会在下面的文章中陆续的分享,也可以关注‘奇牛学院’
来一起讨论