Understanding Unix/Linux Programming note:chapter 2, chapter 3, chapter 4
2013-10-23 00:58
615 查看
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来获取与这些文件和目录对应的更详细的文件属性。
chapter4:
Key-word: readdir, stat, pwd本章通过介绍pwd命令的编写来讲解Unix文件系统。
pwd命令的编写主要用到了上一章讲到的readdir, stat命令。工作过程书中已经说明,如下:
(1)因为“."表示当前目录,可以用stat命令来获取当前目录里的i-节点号。
(2)因为”.."表示上级目录,可以用chdir命令来切换到上级目录。
(3)在“.."目录中,用readdir可以获取与(1)中i-节点对应的该目录的名字。
重复(1)到(3)步,直到到达文件树的顶端。
pwd命令的编写并不能解释Unix文件系统。下面是本章的一些重要概念:
(1)文件系统是文件和目录的集合。
(2)目录是名字(下层目录和文件的名字)和指针(下层目录和文件对应的i-节点表)的列表。
(3)目录中的每一个入口指向一个文件和目录。
(4)目录包含指向父目录和子目录的入口。
(5)Unix文件系统由3部分组成:1)超级块(无需理解); 2)i-节点表,用于存储文件属性; 3)数据块,用于存储文件内容。
(6)i-节点号是文件的唯一标识;
注:(6)说明对于一个文件(数据块),i-节点号只能有一个,但是对应的链接(文件名)可以有多个。
(7)在Unix文件系统中,文件没有文件名,文件仅拥有i-节点号;但是链接有名字,即文件名;
(8)命令mkdir, rmdir, rm, ln, mv,处理的不是数据块,而是与i-节点号对应的链接。如:mv只是将链接从一个目录移动到另一个目录,并没有移动数据块。
相关文章推荐
- Understanding Unix/Linux Programming note:chapter 1:执行可执行文件时的参数传递
- Understanding Unix/Linux Programming note:chapter 6:为用户编程:终端控制和信号
- Understanding Unix/Linux Programming note:chapter 5:连接控制:学习stty
- Understanding Unix/Linux Programming note:chapter 1:more函数的流程图
- Understanding Unix/Linux Programming 笔记:chapter 13:基于数据报(Datagram)的编程:编写许可证服务器
- Understanding Unix/Linux Programming 笔记:chapter 12:连接和协议:编写Web服务器
- Understanding Unix/Linux Programming 笔记:chapter 15:进程间通信(IPC)
- Understanding Unix/Linux Programming 笔记:chapter 7:事件驱动编程:编写一个视频游戏
- Understanding Unix/Linux Programming 笔记:chapter 11:连接到近端或远端的进程:服务器与Socket(套接字)
- Understanding Unix/Linux Programming 笔记:chapter 8:进程和程序:编写命令解释器sh
- Understanding Unix/Linux Programming 笔记:chapter 14:线程机制:并发函数的使用
- Understanding Unix/Linux Programming 笔记:chapter 9:可编程的shell、shell变量和环境; chapter 10:I/O重定向和管道
- Understanding Unix/Linux Programming-cp指令练习
- Understanding Unix/Linux Programming-时钟编程:Alarms
- Understanding Unix/Linux Programming-who指令练习
- Understanding Unix/Linux Programming-ls指令练习一
- Understanding Unix/Linux Programming-ls指令练习二
- Understanding Unix/Linux Programming-pwd指令练习
- Understanding Unix/Linux Programming-设备文件与磁盘连接的概念
- Understanding Unix/Linux Programming-stty指令练习