糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > stat函数与stat结构体

stat函数与stat结构体

时间:2020-02-18 05:49:25

相关推荐

stat函数与stat结构体

转载自:/simmerlee/article/details/8281399

在Linux中,可以利用stat()函数来获取一个文件的状态

[cpp]view plain copy#include<sys/stat.h> #include<unistd.h> intstat(constchar*file_name,structstat*buf); 这个函数执行成功返回0,失败返回-1。取得的文件状态存放在buf指针指向的struct stat结构提中, struct stat的定义如下:[cpp]view plain copystructstat { dev_tst_dev;/*IDofdevicecontainingfile-文件所在设备的ID*/ ino_tst_ino;/*inodenumber-inode节点号*/ mode_tst_mode;/*文件的类型和存取的权限*/ nlink_tst_nlink;/*numberofhardlinks-链向此文件的连接数(硬连接)*/ uid_tst_uid;/*userIDofowner-userid*/ gid_tst_gid;/*groupIDofowner-groupid*/ dev_tst_rdev;/*deviceID(ifspecialfile)-设备号,针对设备文件*/ off_tst_size;/*totalsize,inbytes-文件大小,字节为单位*/ blksize_tst_blksize;/*blocksizeforfilesystemI/O-系统块的大小*/ blkcnt_tst_blocks;/*numberofblocksallocated-文件所占块数*/ time_tst_atime;/*timeoflastaccess-最近存取时间*/ time_tst_mtime;/*timeoflastmodification-最近修改时间*/ time_tst_ctime;/*timeoflaststatuschange-*/ };

其中, st_mode这个变量用来判断文件类型。

st_mode是用特征位来表示文件类型的,特征位的定义如下:

[cpp]view plain copyS_IFMT0170000文件类型的位遮罩 S_IFSOCK0140000socket S_IFLNK0120000符号链接(symboliclink) S_IFREG0100000一般文件 S_IFBLK0060000区块装置(blockdevice) S_IFDIR0040000目录 S_IFCHR0020000字符装置(characterdevice) S_IFIFO0010000先进先出(fifo) S_ISUID0004000文件的(setuser-idonexecution)位 S_ISGID0002000文件的(setgroup-idonexecution)位 S_ISVTX0001000文件的sticky位 S_IRWXU00700文件所有者的遮罩值(即所有权限值) S_IRUSR00400文件所有者具可读取权限 S_IWUSR00200文件所有者具可写入权限 S_IXUSR00100文件所有者具可执行权限 S_IRWXG00070用户组的遮罩值(即所有权限值) S_IRGRP00040用户组具可读取权限 S_IWGRP00020用户组具可写入权限 S_IXGRP00010用户组具可执行权限 S_IRWXO00007其他用户的遮罩值(即所有权限值) S_IROTH00004其他用户具可读取权限 S_IWOTH00002其他用户具可写入权限 S_IXOTH00001其他用户具可执行权限 摘自《LinuxC函数库参考手册》

判断文件类型时,用对文件的st_mode的值与上面给出的值相与,再比较。比如:

[cpp]view plain copy#include<sys/stat.h> #include<unistd.h> #include<stdio.h> intmain() { intabc; structstatbuf; stat("/home",&buf); abc=buf.st_mode&S_IFDIR;//与对应的标志位相与 if(abc==S_IFDIR)//结果与标志位比较 printf("It'sadirectory.\n"); return0; } 运行结果:

It's a directory.

其实还有一个简单的方法,文件类型在POSIX中定义了检查这些类型的宏定义:

[cpp]view plain copyS_ISLINGK(st_mode)判断是否位符号链接 S_ISREG(st_mode)是否为一般文件 S_ISDIR(st_mode)是否为目录 S_ISCHR(st_mode)是否位字符装置文件 S_ISBLK(s3e)是否先进先出 S_ISSOCK(st_mode)是否为socket 可以根据这些函数的返回值判断,如果是,则返回1。(我试了一下,好像是这样的)

如果觉得《stat函数与stat结构体》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。