在缺省情况下,MS—DOS允许用户按Ctrl+Break键来中止程序的运行。在大多数情况下,这是一种很有用的功能,它使用户能从程序不允许退出的地方退出程序,或者从一个运行已经失常的程序中退出。
但是,在某些情况下,这种操作是非常危险的。有些程序一旦被中止,可能就会采取“保护”措施,从而使用户能侵入保密数据区。此外,如果程序在更新磁盘上的数据文件时被中止,很可能就会毁坏数据文件,从而毁掉一些有用的数据。
基于这些原因。在某些程序中,解除Break键的功能是很有必要的。警告:在不能百分之百地肯定这样的代码能起作用之前,不要轻易把它加到你的程序中去!否则,一旦这段代码有误并且程序在运行时阻塞住,你就不得不重新启动计算机,而这很可能会毁掉最近对程序所作的修改。
下面介绍如何使Break键失效。这是一种特殊的操作,在有些计算机上无法实现,而有些计算机上根本就没有Break键。因此,c语言中没有一条特殊命令用来解除Break键的功能,而且,即使在以MS:DOS为操作系统的计算机上,也没有一种标准的方法来实现这一点。在大多数计算机上,你必须用一条特殊的机器语言命令来实现这一点。下面是一个在MS-DOS中解除Break键功能的函数:
#include<dos.h>
void StopBreak()
{
union REGS in,out;
in.x.ax=0x3301:
in.x.dx=O:
int86(0x21,&in,&out);
}
这个函数要设置一组寄存器,即把3301H赋给ax寄存器,把O赋给dx寄存器。然后,它将通过这些寄存器调用中断21H,从而调用DOS,并通知它不再希望让Break键中止程序的运行。
下面是一个用来测试该函数的程序:
#include<stdio.h>
#include<dos.h>
void StopBreak()
{
union REGS in,out:
in.x.ax=Ox3301:
in.x.dx=O:
int86(Ox21,&in,&out):
}
int main()
{
int a:
long b:
StopBreak();
for(a=O;a<100;++a)
{
StopBreak();
printf("Line %d.\n",a);
for(b=O;b<500000L;++b);
}
return O:
}