- 浏览: 142424 次
文章分类
最新评论
stat 函数族可以用来获取文件的结构元信息,主要有以下四个函数:
其中,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 函数族会在调用时自动填充该结构的内容。结构的实际定义可能随具体实现有所不同,但其基本形式是:
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 成员:
另外,POSIX.1 允许实现将进程间通信(IPC)对象(如消息队列和信号量等)说明为文件。下面这些宏可用来从 stat 结构中确定 IPC 对象的类型,它们的参数是指向 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
发表评论
-
打开伪终端设备
2018-07-09 20:50 1252在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1550伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 800多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 950终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 569尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 944虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 710tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 815终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 439终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 579在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 947在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 617在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 497消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 485有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 421FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 389管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 889readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 455POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 615记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 439UNIX 系统中,守护进程遵循下列通用惯例。 ...
相关推荐
另一个与进程控制相关的函数族是`spawn`,它们同样在process.h库中,如`spawnl()`、`spawnle()`等。`spawn`函数与`exec`类似,但它们创建一个新的进程而不是替换当前进程。`spawn`函数允许在不同模式下运行子程序,...
7. **网络编程**:在Linux中,socket API是进行网络通信的基础,包括socket创建、bind, listen, accept, connect, send, recv等函数,以及套接字选项和地址族的概念。 8. **内存映射**:mmap函数允许将文件或设备...
根据提供的文件信息,"stat-cookbook"标题和描述表明这是一本图解概率统计的大全。在统计学的范畴内,概率统计是研究数据收集、分析、解释和展示的学科,旨在从数据中提取有用信息,并通过概率推断对未来事件作出...
在Linux中,我们可以使用`stat`函数族来获取这些信息。`stat`、`fstat`和`lstat`函数都是用于获取文件属性,它们的区别在于获取信息的方式和处理符号链接的策略。`stat`函数通过文件路径获取属性,`fstat`则通过已...
- **指数族**: 探讨指数族分布的特性及其在统计建模中的应用。 ##### 1.3 均匀收敛 - **概述**: 均匀收敛的概念及其在统计学习中的重要性。 - **正式设置**: 定义学习问题的数学框架。 - **可实现的有限假设类**: ...
读者还将学习到如何使用stat()和fstat()获取文件状态,以及chmod()、chown()等改变文件属性的函数。同时,目录操作如mkdir()、rmdir()、opendir()、readdir()也会被详细阐述。 网络编程是现代UNIX系统中不可或缺的...
3. 系统函数的学习方法:本书第三部分主要通过介绍一部分系统函数来帮助读者理解操作系统的工作原理。对于初学者,更应关注Linux平台的特性以及Linux内核的工作原理。书中会尽量兼顾代码的可移植性,避免依赖特定...
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和 ...
socket()的参数定义了协议族(AF_INET)、socket类型(SOCK_STREAM)以及使用的协议(通常为0)。 4. bind()函数:将上面创建的socket绑定到指定的IP地址和端口上。这一步是让服务器开始监听端口,等待客户端的连接...
- **函数**:`open()` 和 `close()`,前面已经介绍过。 ##### 2. 读写文件 - **函数**:`read()` 和 `write()`,前面已经介绍过。 ##### 3. 文件状态 - **函数**:`fstat()`,前面已经介绍过。 ##### 4. `printf`...
从提供的文件内容来看,主要涉及到的是一系列C语言头文件及其相关功能的介绍。根据内容,我们可以将这些头文件按照功能和所属的标准分类,具体如下: ### 数学计算相关 - <complex.h>:支持复数运算的库。 - ...
在文件I/O方面,首先介绍了C标准函数与系统函数的区别,包括I/O缓冲区、效率以及程序的跨平台性。例如,系统调用通常会涉及内核空间与用户空间的数据交换,因此它们需要通过系统接口进行,而标准C库函数则在用户空间...
- **概念介绍**:介绍了概率生成函数和矩生成函数的基本概念及其应用。这两种函数是概率论中用于研究随机变量性质的强大工具。 #### 九、多维分布 - **标准双变量正态分布**:介绍了双变量正态分布的特殊情况——...
- **文件权限**:`chmod`函数用于改变文件权限,`stat`函数获取文件信息。 7. **网络编程** - **套接字**:通过`socket`函数创建,是网络通信的基础。`bind`、`listen`、`accept`、`connect`、`send`、`recv`等...
### Linux系统编程重要知识点概述 ... - `exec`族:替换当前进程的执行上下文。 以上内容涵盖了《Linux系统编程》的主要知识点,这些知识点是学习Linux编程的重要基础,对于理解和掌握Linux系统编程至关重要。