c语言lstat,C语言中fstat、stat和lstat 区别

在写应用程序的时候发现我们经常回去检测一个文件的大小,有了大小才能映射这个文件到内存上,方便我们直接操作。

在介绍三者的区别之前,首先介绍的是一个非常重要的结构体类型,名字叫做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;    /* 总大小,字节为单位  */

blksize_t st_blksize; /* 文件系统的块大小  */

blkcnt_t  st_blocks;  /* 分配给文件的块的数量,512字节为单元  */

time_t    st_atime;   /* 最后访问时间  */

time_t    st_mtime;   /* 最后修改时间  */

time_t    st_ctime;   /* 最后状态改变时间  */

};

tips:这里需要注意的是st_mode这个域不像其他域那么容易使用,需要一些宏予以配合。实际上这些宏就是一些特定位置为1的二进制数的绰号,我们使用它们和st_mode进行”&”操作,从而就可以得到某些特定的信息。

文件类型标志包括:

S_IFBLK:文件是一个特殊的块设备

S_IFDIR:文件是一个目录

S_IFCHR:文件是一个特殊的字符设备

S_IFIFO:文件是一个FIFO设备

S_IFREG:文件是一个普通文件

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:测试是否是目录

S_ISFIFO:测试是否是FIFO设备

S_ISREG:测试是否是普通文件

S_ISLNK:测试是否是符号链接

S_ISSOCK:测试是否是socket

fstat/stat/lstat系统调用

功能描述:

获取一些文件相关的信息。

用法:

#include

#include

#include

int stat(const char *path, struct stat *buf);

int fstat(int filedes, struct stat *buf);

int lstat(const char *path, struct stat *buf);

参数:

path:文件路径名。

filedes:文件描述词。

buf:保存文件信息的结构体

返回说明:

成功执行时,返回0。失败返回-1,errno被设为以下的某个值

EBADF:  文件描述词无效

EFAULT: 地址空间不可访问

ELOOP:  遍历路径时遇到太多的符号连接

ENAMETOOLONG:文件路径名太长

ENOENT:路径名的部分组件不存在,或路径名是空字串

ENOMEM:内存不足

ENOTDIR:路径名的部分组件不是目录

下面放大的部分是他们的区别:

fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是 一个“文件描述符”,而另外两个则直接接受“文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路经直接写就可以了。

stat和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的

下面用一个例子还说明:

b166998a5bdc64dce3a83adbe4bd8ded.png

这个file文件是我自己随便写的一个文件,可以是任何文件,但是要有可读权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值