📄 page217.html
字号:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第8章 文件句柄功能与磁盘</title>
</head>
<body>
<style type="text/css">
body {
background-color: #c0c0c0;
}
table {
background-color: #c0c0c0;
line-height: 24px;
}
</style>
<!导航条>
<p><a href="content1.html">目录</a> <a href="page216.html">上一页</a> <a href="page218.html">下一页</a> <a href="page238.html">下一章</a></p>
<table border=0 align="center" width=800 frame="box" rules="none">
<!标尺行>
<tr>
<td width=3%></td><td width=6%></td><td width=1%></td> <!左侧空白>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=1%></td><td width=6%></td><td width=3%></td> <!右侧空白>
</tr>
<!页眉行>
<tr height=60 valign="bottom">
<td></td><td></td><td></td>
<td colspan=6><img src="icons/flag.gif"></td><td colspan=4></td><td colspan=6 align="right">第8章 文件句柄功能与磁盘</td> <!章节名>
<td></td><td>-217-</td><td></td> <!页码>
</tr>
<!页眉线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!正文>
<font face="宋体" lang="ZH-CN" size=3>
<tr height=20><td colspan=22></td></tr> <!顶部空白>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>
<br>
<br>
exit:<br>
<br>
<br>
main<br>
code<br>
<br>
</td>
<td colspan=2>
mov<br>
int<br>
<br>
mov<br>
int<br>
endp<br>
ends<br>
end
</td>
<td colspan=5>
ah,9<br>
21h<br>
<br>
ah,4ch<br>
21h<br>
<br>
<br>
main
</td>
<td colspan=9>
<br>
<br>
<br>
;结束进程<br>
<br>
<br>
<br>
<br>
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
这是一个不寻常的程序,它的特殊性就在于使用了"不寻常"的文件句柄。还记得前面我们讨论文件句柄时所遗留的那个问题吗?我们打开的第一个文件的句柄号是05H而不是00H,之所以这样是因为句柄号00H-04H已经被占用了。而且更为特殊的是这五个句柄不是赋予五个文件的,而是赋予五种硬件设备。这听上去好象越来越乱了,文件和硬件设备竟然又出现了某种联系,实在让人搞不明白。我想若要弄清楚这个问题,我们还是要从一些实际现象出发。<br>
学过C语言的朋友一定接触过fprintf函数的这样一个用法:<br>
fprintf(STDERR,"DANGER!!!......Found a VIRUS......");<br>
本来,在STDERR这个位置上应该是指向一个文件的指针,这个指针的含义和我们现在讨论的文件句柄是一样的(我想也许汇编语言中的文件句柄就是C语言中文件指针的实质,我没有查过权威资料,这个看法是否正确还有待检验)。现在我们在这个位置上放了一个称为STDERR的常量,而且我们知道这样使用fprintf函数可以使引号中的文字出现在显示器上而不是某个文件中,而显示器又恰好是一个硬件设备。由此看来,文件、文件指针和硬件设备确实应该存在某种联系,这种联系并非在汇编语言程序设计中有体现,在C这样的高级语言中已经体现出来了。那么STDERR又是个什么东西呢?<br>
这个常量出现在名为STDIO.H的一个包含文件中,在C语言中它被称为"标准错误输出设备(STanDard ERRor output device)"C语言中还有两个比较常用的常量,分别为STDIN和STDOUT,即标准输入和标准输出设备。这三种设备通常都与键盘和显示器有关,使用fprintf函数从STDIN读入数据时相当于等待键盘输入;而向STDOUT或STDERR输出的内容都会出现在显示器上。这就有点儿象我们刚刚给出的那个汇编程序,在那个汇编程序中我们在输出数据时使用了一个特殊的句柄,结果导致了所有的文字都出现于显示器上而没有写入什么文件中。<br>
看来我们所使用的那个特殊句柄代表的是显示器而不是文件。我们所使用的DOS系统还有这样一个有趣的功能不知道你是否使用过,那就是"重定向"功能。如果在DOS状态下按下面这样的格式使用DIR命令,大家就会发现文件和设备确实具有某种不寻常的联系:<br>
C:\DOS\>DIR>FILE.LST<br>
本来会出现在显示器上的一行行文件名都跑到一个名叫"FILE.LST"的文件中去了。由此我们设想这样一个结论:我们通过调用DOS的文件句柄功能不仅可以操作文件,同样可以操作一些硬件设备。<br>
这个结论是完全正确的,事实上文件与设备本身就具有一些相似的特点:文件可以读入或写出,而硬件设备同样可以"读入"(键盘)和"写出"(显示器、打印机)。既然它们具有这样相同的特性,当然可以使用同样的形式来操作,这就是DOS为我们提供了那五个特殊句柄的原因。我们下面就来详细谈谈这五个特殊的句柄:<br>
表8-3列出了这五个句柄所代表的硬件设备,其中0、1、2三个句柄是我们最常用的。这五种设备在DOS启动之后就已经"打开",所以我们可以直接使用这五个句柄而不必再编制代码将其打开。有关这五个特殊句柄还有一些更值得深思的地方,比如,我们能否使用3FH功能从
</td>
<td></td><td></td> <!右边距>
</tr>
</font>
<!页脚线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!页脚>
<tr height=60 valign="top">
<td></td><td></td>
<td colspan=9><i>Copyright © 2004-2005 <a href="mailto:webmaster@nucstorm.com">Chunk Lee</a></i></td>
<td colspan=9 align="right"><i><a href="http://www.nucstorm.com" target="_top">www.nucstorm.com</a></i></td>
<td></td><td></td>
</tr>
</table>
<!导航条>
<p align="right"><a href="content1.html">目录</a> <a href="page216.html">上一页</a> <a href="page218.html">下一页</a> <a href="page238.html">下一章</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -