stat函数
stat既有命令也有同名函数,用来获取文件Inode里主要信息,stat 跟踪符号链接,lstat不跟踪符号链接
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
stat里面时间辨析
atime(最近访问时间):
mtime(最近更改时间):指最近修改文件内容的时间
ctime(最近改动时间):指最近改动Inode的时间
一个stat应用的小例子,打印文件的inode、文件大小、文件系统I/O块大小
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#define NAME "1.txt"
int main(void)
{
int ret = -1;
struct stat buf;
memset(&buf, 0, sizeof(buf));//memset之后buf中全是零
ret = stat(NAME, &buf); //stat后buf中有内容了
if(ret < 0)
{
perror("stat");
exit(-1);
}
//成功获取了stat结构体,从中可以得到各种属性信息
printf("inode = %d.\n",buf.st_ino);
printf("st_size = %d.\n",buf.st_size);
printf("st_blksize = %d.\n",buf.st_blksize);
return 0;
}
执行结果:
access函数
#include <unistd.h>
int access(const char *pathname, int mode);
按实际用户ID和实际组ID测试,跟踪符号链接,参数mode
R_OK 是否有读权限
W_OK 是否有写权限
X_OK 是否有执行权限
F_OK 测试一个文件是否存在
实际用户ID与有效用户ID的解释:
sudo执行时,有效用户ID是root,实际用户ID是当前用户
实际应用中,access用的最多的是F_OK参数,去判断一个文件是否存在
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <error.h>
#include <errno.h>
#include <stdlib.h>
int main(void)
{
if(access("abc", F_OK) < 0){
perror("access");
exit(1);
}
printf("file abc is exist.\n");
return 0;
}