文件类型
SylixOS 系统最常见的是普通文件和目录文件,但也有另外一些特殊文件类型,这些文件类型包括以下几种:
- 普通文件,这是最常见的文件类型,这种文件包含了某种形式的数据。这种数据无论是普通文本还是二进制,对于 SylixOS 来说没什么区别。需要注意的是,一个二进制可执行文件,内核必须理解其格式。SylixOS 二进制可执行文件都遵循一种标准化的格式,这种格式使得 SylixOS 能够确定程序代码和数据加载的位置;
- 目录文件,这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针;
- 块设备文件,这种文件提供的 I/O 接口标准符合 SylixOS 对块设备的定义;
- 字符设备文件,这是一种标准的不带缓冲的设备文件,在系统中最为常见的设备文件就是字符设备文件;
- FIFO 文件,这种类型的文件用于进程间通信,有时也称为命名管道;
- 套接字(socket)文件,这种文件可以用于进程间的网络通信;
- 符号链接,这种类型的文件指向另一个文件。
文件类型的信息包含在 stat 结构体的 st_mode 成员中。可通过下图所示的宏来判断,这些宏的参数都是成员 st_mode 的类型值。
![](https://i-blog.csdnimg.cn/blog_migrate/89d6eb35fbb8ca360da26559b4fc2a77.png)
文件类型模式:
下图为文件类型在文件模式中对应的位信息(st_mode 信息)。
![](https://i-blog.csdnimg.cn/blog_migrate/fafd579db35f802f2e479d5b3685ef5e.png)
所有的这些文件类型都有访问权限,每个文件有 9 个访问权限位,可将这些访问权限位分成 3 类,如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/508102ffa9a298b6770222f22d643c92.png)
对于一个文件的读权限位决定了我们是否能够打开现有文件进行读操作。这与 open 函数的 O_RDONLY 和 O_RDWR 标志有关,当然写的情况也类似。
类型转换(函数 readdir、readdir_r)
调用 readdir 函数将返回指定目录的目录信息,readdir 函数是不可重入的。
readdir_r 函 数是 readdir 函数的可重入实现。
#include <dirent.h>
struct dirent *readdir(DIR *dir);
int readdir_r(DIR *pdir, struct dirent *pdirentEntry, struct dirent **ppdirentResult);
函数 readdir 原型分析:
- 此函数成功返回目录信息指针,失败返回 NULL 并设置错误号;
- 参数 dir 是已打开的目录指针。
函数 readdir_r 原型分析:
- 此函数成功返回 0,失败返回-1 并设置错误号;
- 参数 pdir 是已打开的目录指针。
- 输出参数 pdirentEntry 返回目录信息;
- 输出参数 ppdirentResult 指向 pdirentEntry 地址或 NULL。
调用 readdir 函数将返回指定目录的目录信息,readdir 函数是不可重入的。readdir_r 函数是 readdir 函数的可重入实现,pdirentEntry 指向用户缓冲区用于存放目录信息,如果读到目录末尾,则*ppdirentResult 等于 NULL。
读取的目录信息都存放在了 dirent 结构体中,如下所示:
struct dirent {
char d_name[NAME_MAX + 1]; /* 文件名 */
unsigned char d_type; /* 文件类型 (可能为 DT_UNKNOWN) */
char d_shortname[13]; /* fat 短文件名 (可能不存在) */
……
};
d_name 成员保存了目录中文件的名字,d_type 指示了该文件的类型如图1 所示,通过下面的宏可实现文件类型和文件类型模式位(如图2 所示)的互转。
#include <dirent.h>
unsigned char IFTODT①(mode_t mode);
mode_t DTTOIF(unsigned char dtype);
IFTODT
宏将类型模式转换成文件类型,
DTTOIF
宏将文件类型转换成类型模式。