linux系统函数学习_(4)stat函数

linux系统函数学习_(4)stat函数

stat()函数

头文件

#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>

功能:获取文件信息,通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
函数原型:

int stat(const char *path, struct stat *buf);

返回值: 执行成功则返回0,失败返回-1,错误代码存于errno
错误代码:
ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长
参数:

  1. 文件路径名
  2. struct stat 类型的结构体
    struct stat 结构体详解:
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 文件的硬连接数,刚建立的文件值为1
	uid_t		st_uid;		// user ID of owner 所有者用户识别号
 	get_t		st_ged;		// 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 filesystem 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结构体中的st_mode ,该变量占2byte共16位字节,掩码的使用:st_mode&掩码,其定义了下列数种情况:

// 其他人权限(0-2bit) 掩码:S_IRWXO 00007过滤st_mode中除其他人权限以外的信息
    S_IROTH 00004             其他用户具可读取权限
    S_IWOTH 00002             其他用户具可写入权限
    S_IXOTH 00001             其他用户具可执行权限 ​
// 所属组权限(3-5bit) 掩码:S_IRWXG 00070过滤st_mode中除所属组权限以外的信息
    S_IRGRP 00040             用户组具可读取权限
    S_IWGRP 00020             用户组具可写入权限
    S_IXGRP 00010             用户组具可执行权限 ​
//文件所有者权限(6-8bit) 掩码:S_IRWXU 00700过滤st_mode中除文件所有者权限以外的信息
    S_IRUSR(S_IREAD) 00400    文件所有者具可读取权限
    S_IWUSR(S_IWRITE)00200    文件所有者具可写入权限
    S_IXUSR(S_IEXEC) 00100    文件所有者具可执行权限 ​
// 特殊权限位(9-11bit) 很少用
    S_ISUID 04000     		  文件的设置用户ID位(set user-id on execution)
    S_ISGID 02000    		  文件的设置组ID位(set group-id on execution)
    S_ISVTX 01000    		  文件的黏住位(sticky)
// 文件类型(12-15bit) 掩码:S_IFMT 0170000(文件类型的位遮罩)过滤st_mode中除文件类型以外的信息
	S_IFSOCK 0140000 	      套接字
	S_IFLNK  0120000   		  符号连接(软连接)
	S_IFREG  0100000		  普通文件
	S_IFBLK  0060000  	      块设备
	S_IFDIR  0040000    	  目录
	S_IFCHR  0020000    	  字符设备
	S_IFIFO  0010000     	  先进先出(管道)
//上述的文件类型在POSIX中定义了检查这些类型的宏定义:
    S_ISLNK (st_mode)    	  判断是否为符号连接
    S_ISREG (st_mode)   	  是否为一般文件
    S_ISDIR (st_mode)    	  是否为目录
    S_ISCHR (st_mode)   	  是否为字符装置文件
    S_ISBLK (s3e)      		  是否为先进先出
    S_ISSOCK (st_mode) 		  是否为socket

若一目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名,在linux中,最典型的就是这个/tmp目录。

在这里插入图片描述

示例

  1 #include<stdlib.h>
  2 #include<stdio.h>
  3 #include<sys/types.h>
  4 #include<sys/stat.h>
  5 #include<unistd.h>
  6 
  7 int main(int argc, char* argv[1])
  8 {
  9     if(argc < 2)
 10     {
 11         printf("./a.out filename\n");
 12         exit(1);
 13     }
 14     struct stat st;
 15     //struct stat* st;
 16     int ret = stat(argv[1],&st);
 17     if(ret == -1)
 18     {
 19         perror("stat");
 20         exit(1);
 21     }
 22     // 获取文件大小
 23     int size = (int)st.st_size;
 24     printf("file size = %d\n",size);
 25 	
 26		return 0;	
 27 }

fstat()函数和lstat()函数

原型:

int fstat(int fd,struct stat* buf);
int lstat(const char *path, struct stat *buf);

fstat()是打开文件后,根据fd号操作。lstat()函数t相比较stat()函数,无法穿透(追踪),而stat()函数是穿透(追踪)函数,即对软链接文件进行操作时,操作的是链接到的那一个文件,不是软链接文件本身。

参考

  1. 参考黑马程序员linux系统编程资料
  2. stat函数详解

版权声明:本文为abc301302原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。