#include <sys/types.h>
2 #include <dirent.h>
3 #include "../apuestudy/ourhdr.h"
4
5
6 int main(int argc, char *argv[])
7 {
8 DIR *dp;
9 struct dirent *dirp;
10
11 if (argc != 2)
12 err_sys("a signal argument (the d irectory name) is required");
13
14 if ( (dp = opendir (argv[1])) == NULL)
15 err_sys("can't open %s", argv[1]) ;
16
17 while ( (dirp = readdir (dp)) != NULL)
18 printf ("%s/n", dirp->d_name);
19
20
21 closedir(dp);
22 exit(0);
23 }
这是最初的版本,是APUE上的,里面有几个函数和头文件
目录的实际格式依赖与UNIX的具体实现,早期系统如V7有比较简单的结构;每个目录项是16个字节,其中14个字节是文件名,2个字节是I节点编号.而对于4.2BSD而言,允许更长的文件名,每个目录项是可变的。这就意味着读目录的程序与系统有关,为啦简化这种情况。UNIX包含一套与读目录有关的历程,他们是POSIX1的一部分
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *pathname);
struct dirent *readdir(DIR *dp)
void rewinddir (DIR *dp);
int closedir (DIR *dp);
定义在头文件<dirent.h>中的dirent结构与实现有关,但是都包含的成员有两个
struct dirent
{
ino_t d_ino; /*节点*/
char d_name [NAME_MAX +1] /*FIEL NAME */
}
linux文件系统是Linux系统的心脏部分,提供了层次结构的目录和文件。文件系统将磁盘空间划分为每1024个字节一组,称为块 (也有用512字节为一块的,如:SCOXENIX)。编号从0到整个磁盘的最大块数。
全部块可划分为四个部分,块0称为引导块 ,文件系统不用该块;块1称为专用块 ,专用块含有许多信息,其中有磁盘大小和全部块的其他两部分的大小。从块2开始是i节点表 ,i节点表中含有i节点,表的块数是可变的,后面将做讨论。i节点表之后是空闲存储块(数据存储块 ),可用于存放文件内容。
文件的逻辑结构和物理结构是十分不同的,逻辑结构是用户敲入cat命令后所看到的文件,用户可得到表示文件内容的字符流。物理结构是文件实际上如何存放在 磁盘上的存储格式。用户认为自己的文件是边疆的字符流,但实际上文件可能并不是以边疆的方式存放在磁盘上的,长于一块的文件通常将分散地存放在盘上。然而 当用户存取文件时,linux文件系统将以正确的顺序取出各块,给用户提供文件的逻辑结构。
当然,在linux系统的某处一定会有一个表,告诉文件系统如何将物理结构转换为逻辑结构。这就涉及到i节点了。i节点是一个64字节长的表 ,含有有关一个文件的信息,其中有文件大小、文件所有者、文件存取许可方式,以及文件为普通文件、目录文件还是特别文件等。在i节点中最重要的一项是磁盘地址表。
该 表中有13个块号。前10个块号是文件前10块的存放地址。这10个块号能给出一个至多10块长的文件的逻辑结构,文件将以块号在磁盘地址表中出现的顺序 依次取得相应的块。当文件长于10块时又怎样呢?磁盘地址表中的第11项给出一个块号,这个块号指出的块中含有256个块号,至此,这种方法满足了至多长 于266块的文件(272384字节)。如果文件大于266块,磁盘地址表的第12项给出一个块号,这个块号指出的块中含有256个块号,这256个块号 的每一个块号又指出一块,块中含256个块号,这些块号才用于取文件的内容。磁盘地址中和第13项索引寻址方式与第12项类似,只是多一级间接索引。
这样,在linux系统中,文件的最大长度是16842762块,即17246988288字节,有幸是Linux系统对文件的最大长度(一般为1到2M字节)加了更实际的限制,使用户不会无意中建立一个用完整个磁盘区所有块的文件。
文件系统将文件名转换为i节点的方法实际上相当简单。一个目录实际上是一个含有目录表的文件:对于目录中的每个文件,在目录表中有一个入口项,入口项中含 有文件名和与文件相应的i节点号。当用户敲入catxxx时,文件系统就在当前目录表中查找名为xxx的入口项,得到与文件xxx相应的i节点号,然后开 始取含有文件xxx的内容的块。
引导块占用第0号物理块,不属于文件系统管辖,如果系统中有多个文件系统,只有根文件系统才有引导程序放在引导块中,其余文件系统都不使用引导块;
{
ushort di_mode; /*文件类型+用户权限*/
short di_nlink; /*文件链接数*/
ushort di_uid; /*属主用户id*/
ushort di_gid; /*属主用户组id*/
off_t di_size; /*文件大小*/
char di_addr[40]; /*文件数据区起点地址*/
time_t di_atime; /*最后访问时间*/
time_t di_mtime; /*最后修改时间*/
time_t di_ctime; /*创建时间*/
};
-rw-r--r-- 1 root sys 4003 Jul 4 23:37 1