原文地址::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 区别(转)相关推荐

  1. linux中fopen和open的区别,Linux下open与fopen的区别

    int open(const char *path, int access,int mode) path 要打开的文件路径和名称 access 访问模式,宏定义和含义如下: O_RDONLY      ...

  2. linux 下的 source,sh,./三者区别

    前言 工作中遇到的问题,总结一下,参考较多文章总结的,若有错误,望请指出,谢谢! source Linux source命令: 通常用法:source filepath 或 . filepath 它的 ...

  3. Linux下useradd与adduser的区别

    Linux下创建用户时会用到useradd和adduser这两个命令,他们的区别如下: 1.使用useradd时,如果后面不添加任何参数选项,例如:#sudo useradd test创建出来的用户将 ...

  4. linux ide sata硬盘,Linux 下SATA与IDE硬盘区别

    linux下看到的sda字样表示该机器是IDE模式的硬盘,看到sda字样表示机器是SATA模式的硬盘 解析: 使用df -lh(df -h)可以清晰的查看硬盘使用情况 [root@localhost ...

  5. Linux下tmpfs与ramfs的区别

    转自:http://www.linuxidc.com/Linux/2012-11/74356.htm ramfs是Linux下一种基于RAM做存储的文件系统.在使用过程中你就可以把ramfs理解为在普 ...

  6. WINDOWS下与LINUX下写C程序的区别

    要开始编程了,先熟悉下工具,查到的以下资料,有的是说系统区别,有的是说编程区别: 1.如果没有涉及系统独有的库函数或者编程方法(即只用符合ANSI C标准的代码和方法),就没有区别. 如果涉及到系统编 ...

  7. linux 下.bashrc和.profile的区别

    /etc/profile:   这个文件是系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc ...

  8. 【小知识】linux下ls与ll的区别

    在 Linux 系统中,ls 和 ll 命令都是用来列出目录内容的命令,它们的区别如下: ls 命令:是一个简单的文件列表命令,它会列出目录下的文件和子目录的名称,并显示它们的属性和权限等信息. ll ...

  9. linux下cron和cron的区别,Linux环境下` `与$()用法的区别eval和crontab的意义

    命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置.shell中有两种方法作命令替换:把shell命令用反引号或者$(...)结构括起来,其中,$(...)格式受到POSIX标准支 ...

最新文章

  1. Lync 小技巧-49-Lync 自动备份-批量管理-用户(免费视频)
  2. CMakeLists.txt从入门到精通
  3. C语言通过链表指针删除链表节点的算法(附完整源码)
  4. 查看Product table entry数量的几种办法
  5. 量子计算机九章能否预测未来,张礼立 : 中国 “九章”量子计算机到底厉害在哪?...
  6. devops 分支管理策略_DevOps招聘策略以吸引顶尖人才
  7. 年总结(七):这半年的生活(2017.1—2017.7)
  8. Ms08067红队学员 “红蓝实战对抗”报告
  9. APISpace 手机号码归属地API 方便好用
  10. 免费天气API,全国天气 JSON API接口,可以获取五天的天气预报
  11. yigo基础学习笔记3_数据映射_上引下推
  12. 网络攻防技术-Lab5-shellcode编写实验(SEED Labs – Shellcode Development Lab)
  13. 【Altium designer】PCB 各层简介
  14. 投影坐标系的shp数据,如何获取到它地理坐标系下的经纬度坐标
  15. JAVA:实现QuickSort快速排序算法(附完整源码)
  16. 面试题总结 —— JAVA高级工程师
  17. python 微信公众号接口中文乱码问题
  18. R语言 CHAR 01
  19. 测井计算机使用的总线,测井数据处理开始步入工作站时代
  20. 巴基斯坦黑客组织有多牛?连苹果手机也中招

热门文章

  1. python控制安卓手机的闹钟_【玩转Python】为女朋友打造一款智能语音闹钟
  2. 关于IOS调用微信支付jsapi不起作用的解决方法
  3. js实现桌面录屏功能
  4. day04 爬取豌豆荚app数据的两种方法
  5. 工作和生活中,...
  6. 变电站一键顺控(二)
  7. Python Matplotlib绘图的正确打开方式
  8. 大数据Hive学习案例(1)——基于搜狗sogou_500w的日志数据分析
  9. 后台启动zookeeper
  10. 苹果电子邮件怎么注册_外贸技巧 | 6种简单的电子邮件营销技巧,你知道几个?...