Linux系统statlstat函数
Posted fu_GAGA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统statlstat函数相关的知识,希望对你有一定的参考价值。
Linux系统—stat、lstat函数
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
1.1 stat
函数
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *statbuf);
- 作用:获取文件相关的信息
- 参数:
- pathname:操作的文件的路径
- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
- 返回值:
- 成功:返回0
- 失败:返回-1 并设置errno
在Linux系统中包含有stat 文件名
shell命令:
查看文件的相关信息
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ touch a.txt
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ls
a.txt stat.c
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ stat a.txt
文件:a.txt
大小:12 块:8 IO 块:4096 普通文件
设备:801h/2049d Inode:682288 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1000/ fuerer) Gid:( 1000/ fuerer)
最近访问:2022-03-24 15:35:59.947966889 +0800
最近更改:2022-03-24 15:35:59.947966889 +0800
最近改动:2022-03-24 15:35:59.947966889 +0800
创建时间:-
文件信息:
- 文件名
- 大小 12字节
- 块:8 ——> 共占 8 个块
- IO块:4096 ——> 一个块的大小为4096(共占了8个块)
- 普通文件
- 设备:801h/2049d ——> 设备标识
- Inode:682288 ——> Linux中使用Inode标识文件
- 硬链接:1 ——> 硬链接数
- 权限:(0664/-rw-rw-r–)
- Uid:( 1000/ fuerer) ——> 当前用户ID
- Gid:( 1000/ fuerer) ——> 当前用户所在组ID
- 最近访问
- 最近更改 ——> 文件中内容数据、属性发生改变
- 最近改动 ——> 文件的属性(例:权限…)发生改变
- 创建时间
1.1.1 stat 结构体
保存文件的信息
struct stat
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点 Inode
mode_t st_mode; //文件的类型(7种类型和存取的权限)
nlink_t st_nlink; //硬链接数
uid_t st_uid; //用户ID
gid_t st_gid; //用户组ID
dev_t st_rdev; //设备文件的设备编号(如果是一个设备文件)
off_t st_size; //文件的字节数(文件大小)
blksize_t st_blksize; //块大小
blkcnt_t st_blocks; //块数
struct timespec st_atim; //最后一次访问时间
struct timespec st_mtim; //最后一次修改时间
struct timespec st_ctim; //最后一次改动时间(指属性)
#define st_atime st_atim.tv_sec
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
;
1.1.2 st_mode
变量
- 16位
- 使用标志位表示存取权限(有对应权限,为1)
1. 相关宏变量:
- S_IROTH:Is Read others 0004(最后一组:100)
- S_IWOTH:Is Write others 0002(最后一组:010)
- S_IXOTH:Is Read others 0001(最后一组:001)
- S_IRWXO:Is Read Write X others 0007(最后一组:111)
2. 文件类型(12-15位):
- Linux系统一共7种文件类型,使用一个或多个标记位表示
3. 判断是否有某个权限:
- 与相应的宏变量做 按位与 的操作(结果为1,有该权限)
4. 判断文件是否是某个类型:
- 不是按位与,因为不是一个位表示一个类型
(st_mode & S_IFMT) == S_IFREG
- 掩码
S_IFMT = 0170000 = 1111 0000 0000 0000B
st_mode & S_IFMT
得到文件类型的编码,与对应类型比较是否相等即可
- 掩码
1.2 stat
函数使用实例
编写stat.c 文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main()
//1. 定义存放文件信息的结构体
struct stat statbuf;
//2. 调用stat函数获取文件信息,并存放在statbuf中
int ret = stat("a.txt", &statbuf);
if(ret == -1)
perror("stat");
return -1;
//3. 从statbuf中获取文件信息
printf("size: %ld\\n", statbuf.st_size);
return 0;
编译运行:
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ gcc stat.c -o stat
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ./stat
size: 12
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ll
总用量 28
drwxrwxr-x 2 fuerer fuerer 4096 3月 24 16:09 ./
drwxrwxr-x 13 fuerer fuerer 4096 3月 24 15:33 ../
-rw-rw-r-- 1 fuerer fuerer 12 3月 24 15:35 a.txt
-rwxrwxr-x 1 fuerer fuerer 8496 3月 24 16:09 stat*
-rw-rw-r-- 1 fuerer fuerer 1229 3月 24 16:09 stat.c
1.3 lstat
函数与 stat
函数区别
ln -s a.txt b.txt
创建软链接 b.txt -> a.txt
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ln -s a.txt b.txt
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ls
a.txt b.txt stat stat.c
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ll
总用量 28
drwxrwxr-x 2 fuerer fuerer 4096 3月 24 16:10 ./
drwxrwxr-x 13 fuerer fuerer 4096 3月 24 15:33 ../
-rw-rw-r-- 1 fuerer fuerer 12 3月 24 15:35 a.txt
lrwxrwxrwx 1 fuerer fuerer 5 3月 24 16:10 b.txt -> a.txt
-rwxrwxr-x 1 fuerer fuerer 8496 3月 24 16:09 stat*
-rw-rw-r-- 1 fuerer fuerer 1229 3月 24 16:09 stat.c
打开b.txt
实际打开的是 a.txt
- 使用
stat
函数获取b.txt
软链接的信息,获取的是其指向的a.txt
文件的信息 - 获取
b.txt
软链接的信息 ——>lstat
函数
以上是关于Linux系统statlstat函数的主要内容,如果未能解决你的问题,请参考以下文章
python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间内存使用量内存占用率PID名称创建时间等;