fstat、stat和lstat用法

stat系统调用系列包括了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_nlink  该文件上硬连接的个数

struct stat {

dev_t         st_dev;       //文件的设备编号

ino_t         st_ino;       //节点

mode_t        st_mode;      //文件的类型和存取的权限

nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1

uid_t         st_uid;       //用户ID

gid_t         st_gid;       //组ID

dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号

off_t         st_size;      //文件字节数(文件大小)

unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)

unsigned long st_blocks;    //块数

time_t        st_atime;     //最后一次访问时间

time_t        st_mtime;     //最后一次修改时间

time_t        st_ctime;     //最后一次改变时间(指属性)

};

可以分别提取solaris(UNIX)和fedora(Linux)的struct stat结构体的原始定义比对一下便可以发现两者确实有所不同,但主要的域是完全相同的。st_mode这个域不像其他域那么容易使用,其他的域的值显而易见,而st_mode域是需要一些宏予以配合才能使用的。其实,通俗说,这些宏就是一些特定位置为1的二进制数的外号,我们使用它们和st_mode进行”&”操作,从而就可以得到某些特定的信息。

文件类型标志包括:

S_IFMT   0170000    文件类型的位遮罩

S_IFSOCK 0140000    scoket

S_IFLNK 0120000     符号连接

S_IFREG 0100000     一般文件

S_IFBLK 0060000     区块装置

S_IFDIR 0040000     目录

S_IFCHR 0020000     字符装置

S_IFIFO 0010000     先进先出管道

其他模式标志包括:

S_ISUID:文件设置了SUID位

S_ISGID:文件设置了SGID位

S_ISVTX:文件设置了sticky位

用于解释st_mode标志的掩码包括:

S_IRUSR(S_IREAD) 00400     文件所有者具可读取权限

S_IWUSR(S_IWRITE)00200     文件所有者具可写入权限

S_IXUSR(S_IEXEC) 00100     文件所有者具可执行权限

S_IRGRP 00040             用户组具可读取权限

S_IWGRP 00020             用户组具可写入权限

S_IXGRP 00010             用户组具可执行权限

S_IROTH 00004             其他用户具可读取权限

S_IWOTH 00002             其他用户具可写入权限

S_IXOTH 00001             其他用户具可执行权限

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 (st_mode) :测试是否是特殊的块设备文件

S_ISCHR (st_mode) :测试是否是特殊的字符设备文件

S_ISDIR (st_mode) :测试是否是目录

S_ISFIFO (st_mode):测试是否是FIFO设备

S_ISREG (st_mode):测试是否是普通文件

S_ISLNK (st_mode) :测试是否是符号链接

S_ISSOCK (st_mode):测试是否是socket

原型是:

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系统调用接受的是 一个“文件描述符”,而另外两个则直接接受“文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路经直接写就可以了。

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

stat 和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。(似乎有些晕吧,这样记,lstat比stat多了一个l,因此它是有本事处理符号链接文件的,因此当遇到符号链接文件时,lstat当然不会放过。而 stat系统调用没有这个本事,它只能对符号链接文件睁一只眼闭一只眼,直接去处理链接所指文件喽)

2 文件对应的属性

struct stat {

mode_t     st_mode;       //文件对应的模式,文件,目录等

ino_t      st_ino;       //inode节点号

dev_t      st_dev;        //设备号码

dev_t      st_rdev;       //特殊设备号码

nlink_t    st_nlink;      //文件的连接数

uid_t      st_uid;        //文件所有者

gid_t      st_gid;        //文件所有者对应的组

off_t      st_size;       //普通文件,对应的文件字节数

time_t     st_atime;      //文件最后被访问的时间

time_t     st_mtime;      //文件内容最后被修改的时间

time_t     st_ctime;      //文件状态改变时间

blksize_t st_blksize;    //文件内容对应的块大小

blkcnt_t   st_blocks;     //伟建内容对应的块数量

};

可以通过上面提供的函数,返回一个结构体,保存着文件的信息.

3 获取文件属性的几个封装函数

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 判断是否link文件

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_BOOL

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_BOOL IsLink ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0 && S_ISLNK (st.st_mode) );

}

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 判断是否block文件

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_BOOL

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_BOOL IsBlk ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0 && S_ISBLK (st.st_mode) );

}

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 判断是否FIFO文件

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_BOOL

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_BOOL IsFifo ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0 && S_ISFIFO (st.st_mode) );

}

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 判断是否目录文件

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_BOOL

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_BOOL IsDir ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0 && S_ISDIR (st.st_mode) );

}

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 判断是否设备文件

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_BOOL

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_BOOL IsDevice ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0 && S_ISCHR (st.st_mode) );

}

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 判断是否普通文件

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_BOOL

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_BOOL IsFile ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0 && S_ISREG (st.st_mode) );

}

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 判断是否可读

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_BOOL

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_BOOL canAccess ( const char *szFileName )

{

if( access(szFileName, R_OK) == 0 )

return YCPP_TRUE;

return YCPP_FALSE;

}

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 判断是否可修改

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_BOOL

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_BOOL canModify ( const char *szFileName )

{

if ( access(szFileName, W_OK | R_OK) == 0 )

return YCPP_TRUE;

return YCPP_FALSE;

}

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 获取文件上次修改时间

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_RET

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_RET FileLastMTime ( const char *szFileName )

{

struct stat st;

memset ( &st, 0, sizeof(struct stat) );

if ( lstat (szFileName, &st) == 0 )

return st.st_mtime;

printf ( "%s FileLastMTime error %s\n", szFileName, strerror(errno) );

return -1;

}

///////////////////////////////////////////////////////////////////////////////

// 功能说明 : 获取文件大小,以字节为单位

// 输入参数 :

// 输出参数 : VOID

// 返回值   : YCPP_RET

// 使用说明 :

///////////////////////////////////////////////////////////////////////////////

YCPP_RET FileSize ( const char *szFileName )

{

struct stat st;

memset ( &st, 0, sizeof(struct stat) );

if ( lstat (szFileName, &st) == 0 )

return st.st_size;

printf ( "%s FileSize error %s\n", szFileName, strerror(errno) );

return -1;

}

时间: 2024-11-03 05:33:58

fstat、stat和lstat用法的相关文章

(三) 一起学 APUE 之 文件和目录

. . . . . 前面两篇博文讲了文件 IO 的基本操作,但是它们操作的都是文件本身所存储的有效数据.而文件系统保存文件的时候不仅仅要存储文件内的数据,还要存储许多亚数据,即文件属性和其它特征数据.这篇博文 LZ 就带领大家讨论文件系统亚数据的操作. 1.stat(2) 1 stat, fstat, lstat - get file status 2 3 #include <sys/types.h> 4 #include <sys/stat.h> 5 #include <u

Files and Directories

Files and Directories Introduction In the previous chapter we coveredthe basic functions that perform I/O. The discussion centered on I/O for regular files-opening a file, and reading or writing a file. We'll now look at additionalfeatures of the fil

linux程序设计——文件操作(第三章)

第三章    文件操作 3.1 linux文件结构 与UNIX一样,linux环境中的文件具有特别重要的意义,因为它们为操作系统服务和设备提供了一个简单而一致的接口.在linux中,一切都是文件. 这意味着,通常程序可以像使用文件那样使用磁盘文件.串行口.打印机等等. 目录也是文件,但它是一种特殊类型的文件.在现代UNIX(包括linux)版本中,即使是超级用户可能也不再被允许直接对目录进行写左操作了.所有用户通常都使用上层的opendir/readdir接口来读取目录,而无需了解特定系统中目录

APUE读书笔记: 文件和目录

stat, fstat, fstatat 和 lstat函数: stat函数返回与pathname命名文件相关的信息结构: fstat函数返回已在文件描述符fd打开文件的相关信息: lstat函数与stat函数类似,但当命名文件是一个符号链接时,返回该符号链接的相关信息: fstatat函数为相对于当前打开目录(有fd参数指向)的路径名返回文件统计信息. struct stat 的具体定义如下图: 文件类型: 文件类型包括:普通文件,目录文件,块特殊文件,字符特殊文件,FIFO,套接字和符号链接

Linux 文件系统 和文件属性

linux 关机的时候要求先将缓冲区数据写回文件系统 并且卸载该文件系统 如果没有卸载文件系统就关机,会造成数据丢失. Linux在stat.h头文件中使用了一个结构体stat来存放文件的相应属性 可以使用 stat(),fstat()和lstat()函数来获得文件的属性结构体 如果获取成功 返回 0 否则返回 -1 文件属性的操作方法: stat() fstat() lstat()

Notes for Apue &mdash;&mdash; chapter 4 Files and Directories(文件和目录)

4.1 Introduction 4.2 stat, fstat, fstatat, and lstat Functions The lstat function is similar to stat, but when the named file is a symbolic link, lstat returns information about the symbolic link, not the file referenced by the symbolic link. 4.3 文件类

UNIX环境高级编程--4

函数stat fstat fstatat 和 lstat stat函数使用最多的地方可能就是ls -l 命令,用其可以获得有关一个文件的所有信息. 文件类型: (1)普通文件 (2)目录文件 (3)块特殊文件.这种类型的文件提供对设备带缓冲的访问,每次访问以固定长度为单位进行. (4)字符特殊文件:这种类型的文件提供对设备不带缓冲的访问,每次访问的长度可变. (5)FIFO:这种类型的文件用于进程间通信,也叫做命名管道 (6)套接字:用于进程间的网络通讯,也可以用在一台宿主机上进程间的非网络通信

linux文件系统,dup2等

在说linux的文件前,先看看linux的文件系统.虽然实现细节有差异,但文件系统的大致组织形式如下图所示: 局部放大: 由以上两个图可见,对每一个文件都有一个i节点与之对应,这是linux文件系统把文件和文件信息分别抽象出来的结果,文件信息保存在i节点上(i节点长度固定,内容包括文件类型.文件存取许可权位.文件长度和指向该文件所占用的数据块的指针等等,但不包括文件名),可通过系统调用stat(2).fstat(2).lstat(2)获取.i节点数量太多,为提高查找效率,内核有时通过一张hash

【Linux】文件操作系统调用

一. 文件描述符 在Linux下使用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现.文件描述符的范围是0~OPEN_MAX,系统中有3个已经分配的文件描述符,即标准输入.标准输出.和标准错误,他们的文件描述符的值分别为0.1.2. 文件描述符是文件系统中连接用户空间和内核空间的枢纽.当打开一个或者创建一个文件时,内核空间创建相应的结构,并生成一个整型的变量传递给用户空间的对应进程,进程用这个文件描述符来对文件进行操作. 二. 打开.创建文件o