本文主要是介绍stat、fstat、lstat函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
说明:转载请注明出处
函数的具体信息如下表:
用于获取文件信息的函数
头文件 | <sys/types.h> <sys/stat.h> <unistd.h> | ||
函数形式 | int stat(const char *path, struct stat *buf); int fstat(int filedes, struct stat *buf); int lstat(const char *path, struct stat *buf); | ||
返回值 | 成功 | 失败 | 是否设置errno |
0 | -1 | 是 |
说明:
即使没有对该文件的读取权限,仍然可以获得文件信息。对于stat函数和lstat函数,如果是要获得处于某个目录下的文件信息,则要求对该文件所处的所有上级目录有相应的进入权限,即对目录要具有可执行权限(x)。
(1):stat函数通过指向所处路径的指针获取相关文件信息,并将该文件信息写入函数的第二个参数,该参数是指向stat结构体的指针。
(2):lstat函数与stat函数功能是几乎完全相同的。如果给出的文件或目录所处的路径是一个符号链接(符号链接可以理解成类似于windows操作系统中的快捷方式的概念),获得的将是该符号链接的信息,而不是符号链接指向文件的相关信息。
(3):fstat函数与stat函数相同,只是调用的第一个参数换成了文件描述符。
stat结构体具体定义如下所示:
struct stat
{
dev_t st_dev;
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
off_t st_size;
blksize_t st_blksize;
blkcnt_t st_blocks;
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
};
参数含义:
st_dev :文件所处的磁盘设备ID号。
st_inode:inode索引号
st_mode:文件访问权限。Linux编程时遵循POSIX规范的,提供了如下的几个宏用于判断给出的路径所指向的类型,如下表:
POSIX中定义的检查文件类型的宏说明
宏定义形式 | 说明 |
S_ISREG(m) | 是否为普通文件 |
S_ISDIR(m) | 是否为目录 |
S_ISCHR(m) | 是否为字符设备 |
S_ISBLK(m) | 是否为块设备 |
S_ISFIFO(m) | 是否为FIFO(命名管道文件,用于进程通信) |
S_ISLNK(m) | 是否为符号链接 |
S_ISSOCK(m) | 是否为socket |
Linux系统还定义了如下表所示的宏,来表示st_mode文件访问权限:
st_mode中定义的相关宏
宏定义 | 值 | 说明 |
S_IFMT | 0170000 | 获得文件类型的屏蔽位 |
S_IFSOCK | 0140000 | socket |
S_IFLNK | 0120000 | 符号链接 |
S_IFREG | 0100000 | 普通文件 |
S_IFBLK | 0060000 | 块设备 |
S_IFDIR | 0040000 | 目录 |
S_IFCHR | 0020000 | 字符设备 |
S_IFIFO | 0010000 | FIFO文件 |
S_ISUID | 0004000 | 设置了用户ID位 |
S_ISGID | 0002000 | 设置了组ID位 |
S_ISVTX | 0001000 | 设置了sticky位 |
S_IRWXU | 00700 | 获得文件所有者权限的屏蔽位 |
S_IRUSR | 00400 | 文件所有者具有读权限 |
S_IWUSR | 00200 | 文件所有者具有写权限 |
S_IXUSR | 00100 | 文件所有者具有执行权限 |
S_IRWXG | 00070 | 获得文件所有者同组成员权限的屏蔽位 |
S_IRGRP | 00040 | 文件所有者同组成员具有读权限 |
S_IWGRP | 00020 | 文件所有者同组成员具有写权限 |
S_IXGRP | 00010 | 文件所有者同组成员具有执行权限 |
S_IRWXO | 00007 | 获得其他用户权限的屏蔽位 |
S_IROTH | 00004 | 其他用户具有读权限 |
S_IWOTH | 00002 | 其他用户具有写权限 |
S_IXOTH | 00001 | 其他用户具有执行权限 |
st_nlink:该文件所具有的硬链接数
st_uid:文件所有者的用户ID号,该ID好是指哪个具体用户可以通过查看/etc/passwd文件获得。
st_gid:文件所有者所处的组ID。
st_rdev:如果所给出的路径指向的是某具体设备,该值将给出该设备的标识符信息。
st_size:对于常规文件,该值文件大小信息;对于符号链接,该值符号链接所指向的目录长度;对于设备文件,该值被赋值成0.
st_blksize:文件系统的块大小。
st_atime:文件的最后一次访问时间。
st_mtime:文件的最后一次修改时间。
st_ctime:对文件属性的最后一次修改时间。
错误信息:
EACCES:给出的文件所处路径没有访问权限。
EBADF:非法的文件描述符。
EFAULT:地址错误。
FLOOP:给出的文件所在路径中符号链接过多。
ENAMETOOLONG:文件名过长。
ENOENT:给出的文件所处路径不存在或路径为空字符串。
ENOMEM:内存不足。
ENOTDIR:给出的文件所处路径中含有不是目录的部分。
实例:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
//定义类型为stat的结构体file_stat,用于保存获得的文件信息
struct stat file_stat;
//判断程序是否带有一个参数执行,如果不是,给出提示并且结束运行
if ( argc != 2 )
{
printf("Usage:%s filename\n", argv[0]);
return (1);
}
//调用stat函数,如果出现错误,给出错误信息,程序退出
if (stat(argv[1], &file_stat) == -1)
{
perror("Cannot get the information of the file!\n");
return (1);
}
//使用POSIX中定义的宏判断是否是常规文件
if ( S_ISREG(file_stat.st_mode) )
{
printf("%s is Regular File,Judged by S_ISREG\n", argv[1]);
}
//通过st_mode与S_IFREG的位运算判断是否是常规文件
if ( file_stat.st_mode & S_IFREG )
{
printf("%s is Regular File,Judged by bits calculateS_IFREG\n", argv[1]);
}
//通过S_ISDIR宏判断是否是目录
if ( S_ISDIR(file_stat.st_mode) )
{
printf("%s is Directory, Judged by S_ISDIR\n", argv[1]);
}
if ( file_stat.st_mode & S_IFDIR )
{
printf("%s is Directory, Judged by bits calculate S_IFDIR\n",argv[1]);
}
//输出file_stat中的其他文件信息
printf("Owner ID: %d, Group ID: %d\n", file_stat.st_uid,file_stat.st_gid);
printf("Permission: %o\n", file_stat.st_mode & 0x1ff);
printf("Last Access Time: %15s\n",ctime(&file_stat.st_atime));
printf("Last Modification Time: %15s\n",ctime(&file_stat.st_mtime));
printf("Last Status Change Time: %15s\n", ctime(&file_stat.st_ctime));
return (0);
}
代码中给出了两种用于判断给出参数类型的方法:一种是使用POSIX标准中定义的宏表达式;一种是通过位运算得到。在获得访问访问权限时,程序将获得的st_mode值与一个十六进制的数进行位运算,0x1ff换算成八进制就是777.。要获得文件所有者的权限,需要和0700进行位运算。要获得文件所有者所在组的权限,需要和0070进行位运算。而要获得其他用户的权限,需要和0007进行位运算。要获得3者的权限,需要和777进行位运算,也就是程序中使用的0x1ff。
运行的结果:
[root@localhost test]# ./stat chdir
chdir is Regular File,Judged by S_ISREG
chdir is Regular File,Judged by bitscalculate S_IFREG
Owner ID: 0, Group ID: 0
Permission: 755
Last Access Time: Tue Apr 30 01:48:53 2013
Last Modification Time: Tue Apr 30 01:43:172013
Last Status Change Time: Tue Apr 3001:43:17 2013
这篇关于stat、fstat、lstat函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!