linux下fstat、stat和lstat 区别(转)
原文地址::http://www.cnitblog.com/guopingleee/archive/2008/11/13/51411.aspx
相关文章
1、C语言中fstat、stat和lstat 区别----http://blog.csdn.net/qq_21792169/article/details/50454475
2、linux:文件和目录之stat、fstat和lstat函数!!?----http://zhan.renren.com/lyitnews?gid=3602888498060354213&checked=true
3、fstat__百度百科----http://baike.baidu.com/link?url=aJ_RgnP8qcesGzfO9qfwF8Nu0yzXwh9vme9Fwqhsx1urF46z1gLmdtDeFtMCbfzRP_BESY9twW_roqdP9JFsv_
stat系统调用系列包括了fstat、stat和lstat,它们都是用来返回“相关文件状态信息”的,三者的不同之处在于设定源文件的方式不同。
1
首先隆重介绍的是一个非常重要的”VIP”人物,他是fstat, stat和lstat三者都要用到的一个结构体类型,名字叫做struct stat。可以说,没有这个struct stat的支持,上述三个系统调用将寸步难行。
这个struct stat结构体在不同的UNIX/Linux系统中的定义是有小的区别的,但你完全不用担心,这并不会影响我们的使用。
在struct stat结构体中我们常用的且各个平台都一定有的域是:
st_mode 文件权限和文件类型信息 (记住这个黑体橘红色)
st_ino 与该文件关联的inode
st_dev 保存文件的设备
st_uid 文件属主的UID号
st_gid 文件属主的GID号
st_atime 文件上一次被访问的时间
st_ctime 文件的权限、属主、组或内容上一次被修改的时间
st_mtime 文件的内容上一次被修改的时间。(和st_ctime的不同之处显而易见)
st_nlink 该文件上硬连接的个数
我分别提取了solaris(UNIX)和fedora(Linux)的struct stat结构体的原始定义:大家可以自己比对一下便可以发现两者确实有所不同,但主要的域是完全相同的。
solaris的struct 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;
timestruc_t st_atim;
timestruc_t st_mtim;
timestruc_t st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
char st_fstype[_ST_FSTYPSZ];
};
fedora的struct stat定义:
struct stat
{
__dev_t st_dev; /* Device. */
unsigned short int __pad1;
__ino_t st_ino; /* File serial number. */
__mode_t st_mode; /* File mode. */
__nlink_t st_nlink; /* Link count. */
__uid_t st_uid; /* User ID of the file’s owner. */
__gid_t st_gid; /* Group ID of the file’s group.*/
__dev_t st_rdev; /* Device number, if device. */
unsigned short int __pad2;
__off_t st_size; /* Size of file, in bytes. */
__blksize_t st_blksize; /* Optimal block size for I/O. */
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
struct timespec st_atim; /* Time of last access. */
struct timespec st_mtim; /* Time of last modification. */
struct timespec st_ctim; /* Time of last status change. */
unsigned long int __unused4;
unsigned long int __unused5;
};
2
大家一定注意到了,在上面列举域的时候,我在st_mode处使用了黑体橘红色标识,原因在于这个域不像其他域那么容易使用,其他的域的值显而易见,而st_mode域是需要一些宏予以配合才能使用的。其实,通俗说,这些宏就是一些特定位置为1的二进制数的外号,我们使用它们和st_mode进行”&”操作,从而就可以得到某些特定的信息。
文件类型标志包括:
S_IFBLK:文件是一个特殊的块设备
S_IFDIR:文件是一个目录
S_IFCHR:文件是一个特殊的字符设备
S_IFIFO:文件是一个FIFO设备
S_IFREG:文件是一个普通文件(REG即使regular啦)
S_IFLNK:文件是一个符号链接
其他模式标志包括:
S_ISUID:文件设置了SUID位
S_ISGID:文件设置了SGID位
S_ISVTX:文件设置了sticky位
用于解释st_mode标志的掩码包括:
S_IFMT:文件类型
S_IRWXU:属主的读/写/执行权限,可以分成S_IXUSR, S_IRUSR, S_IWUSR
S_IRWXG:属组的读/写/执行权限,可以分成S_IXGRP, S_IRGRP, S_IWGRP
S_IRWXO:其他用户的读/写/执行权限,可以分为S_IXOTH, S_IROTH, S_IWOTH
还有一些用于帮助确定文件类型的宏定义,这些和上面的宏不一样,这些是带有参数的宏,类似与函数的使用方法:
S_ISBLK:测试是否是特殊的块设备文件
S_ISCHR:测试是否是特殊的字符设备文件
S_ISDIR:测试是否是目录(我估计find . -type d的源代码实现中就用到了这个宏)
S_ISFIFO:测试是否是FIFO设备
S_ISREG:测试是否是普通文件
S_ISLNK:测试是否是符号链接
S_ISSOCK:测试是否是socket
3
我们已经学习完了struct stat和各种st_mode相关宏,现在就可以拿它们和stat系统调用相互配合工作了!
int fstat(int filedes, struct stat *buf);
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
聪明人一眼就能看出来fstat的第一个参数是和另外两个不一样的,对!fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是 一个“文件描述符”,而另外两个则直接接受“文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路经直接写就可以了。
stat和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。(似乎有些晕吧,这样记,lstat比stat多了一个l,因此它是有本事处理符号链接文件的,因此当遇到符号链接文件时,lstat当然不会放过。而 stat系统调用没有这个本事,它只能对符号链接文件睁一只眼闭一只眼,直接去处理链接所指文件喽)
linux下fstat、stat和lstat 区别(转)相关推荐
- linux中fopen和open的区别,Linux下open与fopen的区别
int open(const char *path, int access,int mode) path 要打开的文件路径和名称 access 访问模式,宏定义和含义如下: O_RDONLY ...
- linux 下的 source,sh,./三者区别
前言 工作中遇到的问题,总结一下,参考较多文章总结的,若有错误,望请指出,谢谢! source Linux source命令: 通常用法:source filepath 或 . filepath 它的 ...
- Linux下useradd与adduser的区别
Linux下创建用户时会用到useradd和adduser这两个命令,他们的区别如下: 1.使用useradd时,如果后面不添加任何参数选项,例如:#sudo useradd test创建出来的用户将 ...
- linux ide sata硬盘,Linux 下SATA与IDE硬盘区别
linux下看到的sda字样表示该机器是IDE模式的硬盘,看到sda字样表示机器是SATA模式的硬盘 解析: 使用df -lh(df -h)可以清晰的查看硬盘使用情况 [root@localhost ...
- Linux下tmpfs与ramfs的区别
转自:http://www.linuxidc.com/Linux/2012-11/74356.htm ramfs是Linux下一种基于RAM做存储的文件系统.在使用过程中你就可以把ramfs理解为在普 ...
- WINDOWS下与LINUX下写C程序的区别
要开始编程了,先熟悉下工具,查到的以下资料,有的是说系统区别,有的是说编程区别: 1.如果没有涉及系统独有的库函数或者编程方法(即只用符合ANSI C标准的代码和方法),就没有区别. 如果涉及到系统编 ...
- linux 下.bashrc和.profile的区别
/etc/profile: 这个文件是系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc ...
- 【小知识】linux下ls与ll的区别
在 Linux 系统中,ls 和 ll 命令都是用来列出目录内容的命令,它们的区别如下: ls 命令:是一个简单的文件列表命令,它会列出目录下的文件和子目录的名称,并显示它们的属性和权限等信息. ll ...
- linux下cron和cron的区别,Linux环境下` `与$()用法的区别eval和crontab的意义
命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置.shell中有两种方法作命令替换:把shell命令用反引号或者$(...)结构括起来,其中,$(...)格式受到POSIX标准支 ...
最新文章
- Lync 小技巧-49-Lync 自动备份-批量管理-用户(免费视频)
- CMakeLists.txt从入门到精通
- C语言通过链表指针删除链表节点的算法(附完整源码)
- 查看Product table entry数量的几种办法
- 量子计算机九章能否预测未来,张礼立 : 中国 “九章”量子计算机到底厉害在哪?...
- devops 分支管理策略_DevOps招聘策略以吸引顶尖人才
- 年总结(七):这半年的生活(2017.1—2017.7)
- Ms08067红队学员 “红蓝实战对抗”报告
- APISpace 手机号码归属地API 方便好用
- 免费天气API,全国天气 JSON API接口,可以获取五天的天气预报
- yigo基础学习笔记3_数据映射_上引下推
- 网络攻防技术-Lab5-shellcode编写实验(SEED Labs – Shellcode Development Lab)
- 【Altium designer】PCB 各层简介
- 投影坐标系的shp数据,如何获取到它地理坐标系下的经纬度坐标
- JAVA:实现QuickSort快速排序算法(附完整源码)
- 面试题总结 —— JAVA高级工程师
- python 微信公众号接口中文乱码问题
- R语言 CHAR 01
- 测井计算机使用的总线,测井数据处理开始步入工作站时代
- 巴基斯坦黑客组织有多牛?连苹果手机也中招
热门文章
- python控制安卓手机的闹钟_【玩转Python】为女朋友打造一款智能语音闹钟
- 关于IOS调用微信支付jsapi不起作用的解决方法
- js实现桌面录屏功能
- day04 爬取豌豆荚app数据的两种方法
- 工作和生活中,...
- 变电站一键顺控(二)
- Python Matplotlib绘图的正确打开方式
- 大数据Hive学习案例(1)——基于搜狗sogou_500w的日志数据分析
- 后台启动zookeeper
- 苹果电子邮件怎么注册_外贸技巧 | 6种简单的电子邮件营销技巧,你知道几个?...