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的路径名称太长
参数:
- 文件路径名
- 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()函数是穿透(追踪)函数,即对软链接文件进行操作时,操作的是链接到的那一个文件,不是软链接文件本身。
参考
- 参考黑马程序员linux系统编程资料
- stat函数详解
版权声明:本文为abc301302原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。