chapter 2:
Key-word: open file, read file, who, cp, logout
通过介绍who命令的编写来讲解Unix对文件的操作。
who命令用于显示系统中活动用户的情况,所有的这些数据都记录在utmp文件中,以struct utmp的形式存储。因此想要获取这些信息,就必须读utmp文件。这就用到了open, read, close函数。
Notice:
The utmp file allows one to discover information about who is currently using the system.
The file is a sequence of utmp structures, declared as follows in <utmp.h>.
也就是说:已登录用户的信息放在/var/run/utmp文件中,而utmp中的数据结构定义在/usr/include/utmp.h中。
cp命令就是read一个文件的数据,再将这组数据write入另外一个文件。
logout的实现是通过read一个文件的数据,修改这些数据,再将修改后的数据写入这个文件。
chapter 3:
Key-word: open directory, opendir, readdir, closedir, stat, ls
通过介绍ls命令的编写 来讲解Unix对目录的操作。
ls命令用于列出目录中所有文件(目录也是一种特殊的文件)的名字,以及这些文件的类型和属性。
目录是一种特殊的文件,它的内容是文件和目录的名字、i-节点等,这些信息以struct dirent 的形式记录在目录中(因为目录是一种特殊的文件)。因此要列出一个目录内所有目录和文件的名字、i-节点,就需要调用opendir, readdir, closedir通过读目录来获取信息。
注意:readdir返回的是一个指向目录的当前记录的指针,也就是一个指向struct dirent类型的指针。readdir一次只获取一个指向当前记录的指针,获取完后,Unix或者readdir内部已经将指针指向下一个记录,再调用readdir时就获取的是指向这个记录的指针。
但是要获取更详细的文件信息,就要调用stat。stat用于提取文件属性,包括:模式(mode),链接书(links),文件所有者(owner),大小(size)等,这些信息以struct stat 的形式记录在i-节点表中。每个i-节点编号指向i-节点表中的一个struc stat 结构。
如下所示stat有两个参数,第一是输入参数--文件名,第二个是输出参数--该文件的属性信息。
int result = stat(char * fname, struct stat * bufp)
因此,ls的实现过程就是:首先通过readdir()获取该目录内所有文件和目录的名字;然后调用stat来获取与这些文件和目录对应的更详细的文件属性。