Linux下文件属性
这些文件的详细信息是存放在一个结构体stat里面的,当文件系统运行起来后,它从磁盘里面将文件详细信息加载到内核空间内存里,用户空间可以通过系统调用函数stat(),fstat()来取得这个结构体的信息。
Stat结构体:
struct stat {
dev_t st_dev; /* 文件系统设备号 */
ino_t st_ino; /* i结点号 */
mode_t st_mode; /* 文件类型,权限位 */
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; /* 文件所占块个数 */
time_t st_atime; /* 上次访问时间 */
time_t st_mtime; /* 上次修改时间 */
time_t st_ctime; /* 上次文件状态修改时间 */
};
首先,其类型被typedef过了,因此看不出其类型来,可以通过grep命令来查看(具体操作看第一节),我们对比着上图文件信息来看,基本上这一个结构体,将整个的文件的基本信息都包含了,通过读取这个结构体,就能实现一个简单的ls –l的shell命令了。
Stat函数
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
功能:查看文件或目录属性
参数:path是文件的路径, buf就是stat结构体的指针。
返回值:成功返回0,错误返回-1
现在通过这个函数我们可以取得stat结构体了,那么通过读结构体就能得到ls –l 一样的效果了。
我们来看一个例子:
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char * argv[])
{
if(argc != 2) {
printf("Usage: <pathname>\n");
}
int i = 0;
struct stat buf;
if(stat(argv[1], &buf) < 0) {
perror("stat");
}
printf("%d %d %d %d %d %d %s\n", buf.st_mode,
buf.st_nlink, buf.st_uid, buf.st_gid,
buf.st_size, buf.st_atime, argv[1]);
return 0;
}
运行结果:
我们发现,除了硬链接数,文件大小,文件名一样,其它全部都不一样。
看来还有很多东西要处理下,我们来分析下。
首先是st_mode,它是一个int型的成员,而ls –l显示出来是字符串
st_uid, st_gid这两个也是int型成员,而ls是用户名