1、stat函数
要点:
int stat(const char *pathname, struct stat *statbuf);
作用:查看文件的信息
man 2 stat
/return value
1、stat结构体:
2、sturct stat 结构体中 st_mode 的含义(文件的类型和存取的权限):
st_mode是个32位的整型变量,不过现在的linux操作系统只用了低16位(估计是鉴于以后拓展的考虑)
File type 属性区域,位于bit12 ~ bit15
在现代linux操作系统上文件类型共分为7种,分别是:
1、普通文件(regular file)
2、目录(directory)
3、字符设备(character device)
4、块设备(block device)
5、管道(FIFO)
6、符号链接文件(symbolic link)
7、套接字文件(socket)
详情看 sturct stat 结构体中 st_mode 的含义
(st_mode & S_IFMT) == S_IFREG 通过与 掩码 与&运算 可以判断st_mode是不是一个普通文件
总结:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *statbuf);
作用:获取一个文件相关的一些信息
参数:
- pathname:操作的文件的路径
- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errno
测试:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main() {
struct stat statbuf;
int ret = stat("a.txt", &statbuf);
if(ret == -1) {
perror("stat");
return -1;
}
printf("size: %ld\n", statbuf.st_size);
return 0;
}
2、lstat函数
要点:
int lstat(const char *pathname, struct stat *statbuf);
软链接 lrwxrwxrwx b.txt -> a.txt
petri@XX:~/lesson01/05_io$ touch a.txt
petri@XX:~/lesson01/05_io$ ln -s a.txt b.txt
petri@XX:~/lesson01/05_io$ ls -l
total 2
-rw-r--r-- 1 petri petri 0 Apr 22 18:34 a.txt
lrwxrwxrwx 1 petri petri 5 Apr 22 18:35 b.txt -> a.txt
petri@XX:~/lesson01/05_io$ stat b.txt
File: b.txt -> a.txt
Size: 5 Blocks: 0 IO Block: 512 symbolic link
Device: 2h/2d Inode: 212232132439866878 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ petri) Gid: ( 1000/ petri)
Access: 2024-04-22 18:35:14.200056400 +0800
Modify: 2024-04-22 18:35:14.200056400 +0800
Change: 2024-04-22 18:35:14.200056400 +0800
Birth: -
b.txt大小为 5 ,此时打开b.txt看到的其实是a.txt,因此stat b.txt获取的其实是它指向的文件的信息。
l表示软连接,此时如果想获取b.txt的信息,就需要用到 lstat
这个函数了。
int lstat(const char *pathname, struct stat *statbuf);
参数:
- pathname:操作的文件的路径
- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errno
man 2 lstat