`

stat 函数族介绍

阅读更多
    stat 函数族可以用来获取文件的结构元信息,主要有以下四个函数:
#include <sys/stat.h>

int stat(const char *restrict pathname, struct stat *restrict buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *restrict pathname, struct stat *restrict buf);
int fstatat(int fd,const char *restrict pathname,struct stat *restrict buf,int flag);
                     /* 四个函数的返回值:若成功,返回 0;否则,返回 -1 */

    其中,stat 函数获得与 pathname 命名文件有关的信息结构;fstat 函数获得已在描述符 fd 上打开文件的有关信息;lstat 函数类似于 stat,但当命名文件是一个符号链接时,则获取的是该符号链接的有关信息,而非引用文件的信息。
    fstatat 函数为一个相对于当前打开目录(由 fd 参数指向)的路径名返回文件统计信息。flag 参数控制着是否跟随着一个符号链接。当设置 AT_SYMLINK_NOFOLLOW 标志时,fstatat 函数不会跟随符号链接,而是返回符号链接本身的信息。否则,在默认情况下,返回的是符号链接所指向的实际文件的信息。如果 fd 参数的值是 AT_FDCWD,并且 pathname 是一个相对路径名,
fstatat 会计算相对于当前目录的 pathname 参数。如果 pathname 是一个绝对路径,fd 参数就会被忽略。这两种情况下,根据 flag 的取值,fstatat 的作用就跟 stat 或 lstat 一样。
    另一个参数 buf 是一个 stat 结构地址,stat 函数族会在调用时自动填充该结构的内容。结构的实际定义可能随具体实现有所不同,但其基本形式是:
struct stat{
    mode_t    st_mode;      // file type & mode (permissions)
    ino_t     st_ino;       // i-node number (serial number)
    dev_t     st_dev;       // device number (file system)
    dev_t     st_rdev;      // device number for special files (XSI)
    nlink_t   st_nlink;     // number of links
    uid_t     st_uid;       // user ID of owner
    gid_t     st_gid;       // group ID of owner
    off_t     st_size;      // size in bytes, for regular files
    struct timespec    st_atim;    // time of last access
    struct timespec    st_mtim;    // time of last modification
    struct timespec    st_ctim;    // time of last file status change
    blksize_t    st_blksize;    // best I/O block size (XSI)
    blkcnt_t     st_blocks;     // number of disk blocks allocated (XSI)
};

    timespec 结构类型按照秒和纳秒定义了时间,至少包括下面两个字段:
        time_t tv_sec;
        long tv_nsec;
    stat 结构中的 st_mode 包含了文件类型信息,文件类型包括如下几种:
    (1) 普通文件(regular file)。这是最常用的文件类型,包含了某种形式的数据。至于是文本还是二进制数据,UNIX 内核并不在意,因为对普通文件内容的解释是由该文件的应用程序进行的。不过一个值得注意的例外是二进制可执行文件。为了执行程序,内核必须理解其格式。所有二进制可执行文件都遵循一种标准化的格式,以便内核能够确定程序文本和数据的加载位置。
    (2) 目录文件(directory file)。这种文件包含了其他文件的名字以及指向与这些文件信息有关的指针。对一个目录具有读权限的任意进程都可以读该目录的内容,但只有内核可以直接写目录文件,进程必须使用特定的函数才能更改目录。
    (3) 块特殊文件(block special file)(注意,FreeBSD 不再支持块特殊文件,对设备的所有访问需要通过字符特殊文件进行)。这种类型的文件提供对设备(如磁盘)带缓冲的访问,每次访问以固定长度为单位进行。
    (4) 字符特殊文件(character special file)。这种类型的文件提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。
    (5) FIFO。这种类型的文件用于进程间通信,有时也称命名管道(named pipe)。
    (6) 套接字(socket)。这种类型的文件用于进程间的网络通信,也可以用于一台宿主机上进程间的非网络通信。
    (7) 符号链接(symbolic link)。这种类型的文件指向另一个文件。
    可以用下面这些宏来确定文件类型,这些宏的参数都是 stat 结构中的 st_mode 成员:
#include <sys/stat.h>

S_ISREG()        // 普通文件
S_ISDIR()        // 目录文件
S_ISCHR()        // 字符特殊文件
S_ISBLK()        // 块特殊文件
S_ISFIFO()       // 管道或 FIFO
S_ISLNK()        // 符号链接
S_ISSOCK()       // 套接字

    另外,POSIX.1 允许实现将进程间通信(IPC)对象(如消息队列和信号量等)说明为文件。下面这些宏可用来从 stat 结构中确定 IPC 对象的类型,它们的参数是指向 stat 结构的指针:
#include <sys/stat.h>

S_TYPEISMQ()     // 消息队列
S_TYPEISSEM()    // 信号量
S_TYPEISSHM()    // 共享存储对象

    下面是一个查看文件类型的示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main(int argc, char *argv[]){
	int i;
	struct stat buf;
	char *ptr;

	for(i=1;i<argc;i++){
		printf("%s: ", argv[i]);
		if(lstat(argv[i], &buf) < 0){
			printf("lstat error\n");
			continue;
		}
		if(S_ISREG(buf.st_mode))
			ptr = "regular";
		else if(S_ISDIR(buf.st_mode))
			ptr = "directory";
		else if(S_ISCHR(buf.st_mode))
			ptr = "character special";
		else if(S_ISBLK(buf.st_mode))
			ptr = "block special";
		else if(S_ISFIFO(buf.st_mode))
			ptr = "fifo";
		else if(S_ISLNK(buf.st_mode))
			ptr = "symbolic link";
		else if(S_ISSOCK(buf.st_mode))
			ptr = "socket";
		else
			ptr = "** unknown mode **";
		printf("%s\n", ptr);
	}
	exit(0);
}

    运行结果:
$ ./printFileType.out /etc/passwd /etc /dev/log /dev/tty /var/lib/oprofile/opd_pipe /dev/sr0 /dev/cdrom
/etc/passwd: regular
/etc: directory
/dev/log: socket
/dev/tty: character special
/var/lib/oprofile/opd_pipe: lstat error
/dev/sr0: block special
/dev/cdrom: symbolic link
分享到:
评论

相关推荐

    C函数库介绍

    另一个与进程控制相关的函数族是`spawn`,它们同样在process.h库中,如`spawnl()`、`spawnle()`等。`spawn`函数与`exec`类似,但它们创建一个新的进程而不是替换当前进程。`spawn`函数允许在不同模式下运行子程序,...

    Linux C 函数.rar

    7. **网络编程**:在Linux中,socket API是进行网络通信的基础,包括socket创建、bind, listen, accept, connect, send, recv等函数,以及套接字选项和地址族的概念。 8. **内存映射**:mmap函数允许将文件或设备...

    stat-cookbook

    根据提供的文件信息,"stat-cookbook"标题和描述表明这是一本图解概率统计的大全。在统计学的范畴内,概率统计是研究数据收集、分析、解释和展示的学科,旨在从数据中提取有用信息,并通过概率推断对未来事件作出...

    文件和目录.docx

    在Linux中,我们可以使用`stat`函数族来获取这些信息。`stat`、`fstat`和`lstat`函数都是用于获取文件属性,它们的区别在于获取信息的方式和处理符号链接的策略。`stat`函数通过文件路径获取属性,`fstat`则通过已...

    斯坦福 CS229T 统计学习理论讲义

    - **指数族**: 探讨指数族分布的特性及其在统计建模中的应用。 ##### 1.3 均匀收敛 - **概述**: 均匀收敛的概念及其在统计学习中的重要性。 - **正式设置**: 定义学习问题的数学框架。 - **可实现的有限假设类**: ...

    UNIX环境高级编程

    读者还将学习到如何使用stat()和fstat()获取文件状态,以及chmod()、chown()等改变文件属性的函数。同时,目录操作如mkdir()、rmdir()、opendir()、readdir()也会被详细阐述。 网络编程是现代UNIX系统中不可或缺的...

    linux-sys.zh 邢文鹏课件

    3. 系统函数的学习方法:本书第三部分主要通过介绍一部分系统函数来帮助读者理解操作系统的工作原理。对于初学者,更应关注Linux平台的特性以及Linux内核的工作原理。书中会尽量兼顾代码的可移植性,避免依赖特定...

    UNIX高级编程 计算机科学丛书

    4.2 stat,fstat和lstat函数 4.3 文件类型 4.4 设置-用户-ID和设置-组-ID 4.5 文件存取许可权 4.6 新文件和目录的所有权 4.7 access函数 4.8 umask函数 4.9 chmod 和fchomod函数 4.10 粘住位 4.11 chown, fchown和 ...

    linuxcsocket.pdf

    socket()的参数定义了协议族(AF_INET)、socket类型(SOCK_STREAM)以及使用的协议(通常为0)。 4. bind()函数:将上面创建的socket绑定到指定的IP地址和端口上。这一步是让服务器开始监听端口,等待客户端的连接...

    Linux系统编程笔记

    - **函数**:`open()` 和 `close()`,前面已经介绍过。 ##### 2. 读写文件 - **函数**:`read()` 和 `write()`,前面已经介绍过。 ##### 3. 文件状态 - **函数**:`fstat()`,前面已经介绍过。 ##### 4. `printf`...

    C语言头文件大全程序设计语言.pdf

    从提供的文件内容来看,主要涉及到的是一系列C语言头文件及其相关功能的介绍。根据内容,我们可以将这些头文件按照功能和所属的标准分类,具体如下: ### 数学计算相关 - &lt;complex.h&gt;:支持复数运算的库。 - ...

    linux-sys.zh.pdf

    在文件I/O方面,首先介绍了C标准函数与系统函数的区别,包括I/O缓冲区、效率以及程序的跨平台性。例如,系统调用通常会涉及内核空间与用户空间的数据交换,因此它们需要通过系统接口进行,而标准C库函数则在用户空间...

    数据分析实例cookbook EnglishVer

    - **概念介绍**:介绍了概率生成函数和矩生成函数的基本概念及其应用。这两种函数是概率论中用于研究随机变量性质的强大工具。 #### 九、多维分布 - **标准双变量正态分布**:介绍了双变量正态分布的特殊情况——...

    Linux下的c 编程

    - **文件权限**:`chmod`函数用于改变文件权限,`stat`函数获取文件信息。 7. **网络编程** - **套接字**:通过`socket`函数创建,是网络通信的基础。`bind`、`listen`、`accept`、`connect`、`send`、`recv`等...

    linux-sys.zh

    ### Linux系统编程重要知识点概述 ... - `exec`族:替换当前进程的执行上下文。 以上内容涵盖了《Linux系统编程》的主要知识点,这些知识点是学习Linux编程的重要基础,对于理解和掌握Linux系统编程至关重要。

Global site tag (gtag.js) - Google Analytics