获取文件状态、文件属性的函数。 l:软连接 lstat():查看软连接本身的信息
函数描述:
获取文件属性,lstat
和stat的区别在于如果文件是符合链接,返回的文件属性是符号链接本身。fstat
则是指定文件描述符获取文件信息。
头文件:
#include <sys/stat.h>
函数原型:
int stat(const char *pathname, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
函数参数:
pthname
:要获取属性的文件路径
statbuf
:传出参数,指向struct
stat结构体的指针,用于存储获取到的文件信息
fd
:要获取属性的文件描述符
函数返回值:
成功返回0
失败返回-1
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>
#include<errno.h>
#include <sys/stat.h>
#include<time.h>
int main(int argc, char* argv[])
{
struct stat file_info;
stat("a.txt", &file_info);
//访问结构体里的字段用点
printf("st_ino = %ld\n", file_info.st_ino);//端口号
printf("st_mode = %d\n", file_info.st_mode);//类型和权限
printf("st_nlink = %ld\n", file_info.st_nlink);//硬链接计数
printf("st_uid = %d\n", file_info.st_uid);//uid
printf("st_gid = %d\n", file_info.st_gid);//gid
printf("st_size = %ld\n", file_info.st_size);//大小
printf("st_atime = %s\n", ctime(&file_info.st_atime));//时间
return 0;
}
用-il也都能打出来
st_mode为16位整数,低12位代表文件权限,只需要了解低9位。高4位代表文件类型,如下列出用以检查权限和文件类型的宏
●检查文件权限的宏:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>
#include<errno.h>
#include <sys/stat.h>
#include<time.h>
int main(int argc, char* argv[])
{
struct stat file_info;
stat("a.txt", &file_info);
//访问结构体里的字段用点
printf("st_ino = %ld\n", file_info.st_ino);//端口号
printf("st_mode = %d\n", file_info.st_mode);//类型和权限
printf("st_nlink = %ld\n", file_info.st_nlink);//硬链接计数
printf("st_uid = %d\n", file_info.st_uid);//uid
printf("st_gid = %d\n", file_info.st_gid);//gid
printf("st_size = %ld\n", file_info.st_size);//大小
printf("st_atime = %s\n", ctime(&file_info.st_atime));//时间
if(file_info.st_mode & S_IWUSR){
printf("文件拥有者有写权限\n");
}
return 0;
}
●检查文件类型的宏: (s_IFMT
:掩码,过滤st_mode 权限部分,保留文件类型部分)
过滤掉后12位。
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>
#include<errno.h>
#include <sys/stat.h>
#include<time.h>
int main(int argc, char* argv[])
{
struct stat file_info;
stat("a.txt", &file_info);
//访问结构体里的字段用点
printf("st_ino = %ld\n", file_info.st_ino);//端口号
printf("st_mode = %d\n", file_info.st_mode);//类型和权限
printf("st_nlink = %ld\n", file_info.st_nlink);//硬链接计数
printf("st_uid = %d\n", file_info.st_uid);//uid
printf("st_gid = %d\n", file_info.st_gid);//gid
printf("st_size = %ld\n", file_info.st_size);//大小
printf("st_atime = %s\n", ctime(&file_info.st_atime));//时间
if(file_info.st_mode & S_IWUSR){
printf("文件拥有者有写权限\n");
}
if((file_info.st_mode & S_IFMT) == S_IFREG ){
printf("该文件是普通文件\n");
}
if(S_ISREG(file_info.st_mode)) {
printf("该文件是普通文件\n");
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/stat.h>
int main(int argc, char* argv[])
{
int fd = open("mc.txt", O_RDWR);
int fd2 = open("a.txt", O_RDWR | O_NONBLOCK);
char buf[1024];
int read_count = read(fd, buf, sizeof(buf));
printf("read_count = %d\n", read_count);
perror("读取文件失败");
struct stat file_info;
stat("a.txt", &file_info);
printf("st_mode = %d\n", file_info.st_mode);
if(file_info.st_mode & S_IRUSR){
printf("文件拥有者有读权限\n");
}
return 0;
}