学习笔记
stat函数
获取文件属性,说白了就是从inode中获取
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *statbuf);
第一参数:文件路径 传入参数
第二参数:struct stat *statbuf:传出参数,存储文件属性信息
返回值:
成功是0
失败是-1
重点是结构体
几乎就是ls -l出来的信息
struct stat {
dev_t st_dev; /* ID of device containing file *///使用的设备
ino_t st_ino; /* Inode number *///inode 号
mode_t st_mode; /* File type and mode *///访问权限
nlink_t st_nlink; /* Number of hard links *///硬链接数
uid_t st_uid; /* User ID of owner *///UID
gid_t st_gid; /* Group ID of owner *///GID
dev_t st_rdev; /* Device ID (if special file) */
off_t st_size; /* Total size, in bytes *///大小
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated *///占用几个扇区
/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */
struct timespec st_atim; /* Time of last access */
struct timespec st_mtim; /* Time of last modification */
struct timespec st_ctim; /* Time of last status change */
#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
获取文件大小的正规操作:st_size成员
查看下面的程序:
$cat mystat.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
struct stat sbuf;
int ret = stat(argv[1],&sbuf);
if( -1 == ret )
{
perror("stat error");
exit(1);
}
printf("file size:%ld\n",sbuf.st_size);
return 0;
}
$ls
f.c makefile mystat mystat.c
$./mystat ./f.c
file size:500
$ls -l f.c
-rwxr--r-- 1 ubuntu ubuntu 500 12月 24 00:00 f.c
作业:
st_mode 就是文件类型,使用这个成员来可以判断文件类型
if ((sb.st_mode & S_IFMT) == S_IFREG) {
/* Handle regular file */
}
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)