第7章 系统接口函数库:dos.h dos.h提供对底层硬件操作的功能。在高级语言中,这部分功能大多数已由更高级的函数实现了。如果读者是汇编的高手,熟练掌握各种DOS调用和BIOS调用,C语言编程水平将会大大提高。 7.1 allocmem()——DOS分配存储段函数 allocmem()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\01
allocmem()函数用于为DOS模块分配内存,以节为单位,每节16字节。
语法
int allocmem(unsigned size, unsigned *seg);
allocmem()函数的语法参数说明如下:
参数size为分配内存块的大小,以节为单位,每节16字节。
参数seg为保存分配的地址。
allocmem()函数的返回值:成功返回-1,不成功则返回其他值。
示例
本示例演示用allocmem()函数为DOS分配1024字节。其具体代码如下:
运行结果如图7.1所示。
图7.1 allocmem()函数的执行结果 7.2 bdos()——DOS系统调用函数 bdos()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\02
bdos()函数用于DOS系统调用,即21H功能调用,它有丰富的功能,其具体功能请参阅汇编语言方面的书籍。
语法
int bdos(int fnum, unsigned dx, unsigned al);
bdos()函数的语法参数说明如下:
参数fnum为系统调用号。
参数dx为传给寄存器DX的值。
参数al为传给寄存器AL的值。
bdos()函数的返回值:AX中的值。
示例
本示例演示使用bdos ()函数调用DOS功能19H子功能获取当前驱动器号。其具体代码如下:
运行结果如图7.2所示。
图7.2 用bdos()函数获取当前驱动器号 7.3 country()——返回国家相关信息函数 country()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\03
country()函数用于获取国家信息,即Windows中的区域设置信息。
语法
struct country country(int countrycode, struct country country);
country()函数的语法参数说明如下:
参数countrycode为国家代码。
参数country为返回国家信息的地址。
country()函数的返回值:返回国家信息的地址。
示例
本示例演示使用country()函数获取中国的相关区域设置信息。其具体代码如下:
运行结果如图7.3所示。
图7.3 用country()函数获取国家信息 7.4 ctrlbrk()——设置Ctrl-Break处理程序函数 ctrlbrk()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\04
ctrlbrk()函数用于修改中断向量0x23,自己编程控制Ctrl-Break响应功能。
语法
void ctrlbrk(int(*handle)(void));
ctrlbrk()函数的语法参数说明如下:
参数handle为新设置的Ctrl-Break响应函数。
ctrlbrk()函数没有返回值。
示例
本示例演示正常执行时,循环显示1~100之间的数,当按Ctrl+Break键后执行fun()函数,显示new function,按任意键后继续正常执行。实际应用中可完善fun()函数功能。其具体代码如下:
运行结果如图7.4所示。
图7.4 用ctrlbrk()函数重新定义Ctrl-Break功能 7.5 delay()——以毫秒为单位的延时函数 delay()函数
实用程度:★★★★☆
实例位置:配套资源\SL\07\05
delay()函数用于将程序的执行延时一段时间(毫秒)。
语法
void delay(unsigned millisecond);
delay()函数的语法参数说明如下:
参数millisecond为延时的毫秒数,在TC中声明的是以毫秒表示的时间,但实际与机器主频相关。其最大值为65535,要想获得更大延时,可以用循环语句或sleep()函数,它以秒为单位延时。
delay()函数没有返回值。
示例
本示例演示用delay()函数实现每显示一个字母延时一段时间(在作者电脑上大约一秒左右)。其具体代码如下:
运行结果如图7.5所示。
图7.5 delay()函数的执行结果 7.6 dosexterr()——获取扩展DOS错误信息函数 dosexterr()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\06
程序执行出错时,系统会搜集错误信息,C语言中可以通过dosexterr()函数获取这些信息。
语法
int dosexterr(struct DOSERR*eblkp);
dosexterr()函数的语法参数说明如下:
参数eblkp为返回出错信息的结构体变量地址。
dosexterr()函数的返回值:错误代码,即eblkp中exterror的值。
示例
本示例演示用fopen()函数打开文件,但文件不存在,此时DOS出错,用dosexterr()函数获取错误信息。其具体代码如下:
运行结果如图7.6所示。
图7.6 用dosexterr()函数获取的错误信息 7.7 dostounix()——把DOS时间转换为UNIX时间 dostounix()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\07
DOS时间是一个以年月日时分秒表示的时间,用结构体表示,UNIX时间是用一个长整数表示的时间,以秒计时,DOS时间用于显示数据比较方便,UNIX时间用于计算较方便。dostounix()函数提供把DOS时间转换为UNIX时间的功能。
语法
long dostounix(struct date d, struct time t);
dostounix()函数的语法参数说明如下:
参数d为DOS日期指针。
参数t为DOS时间指针。
struct date 结构见 7.12节。
struct time 结构见 7.14节。
dostounix()函数的返回值:UNIX 时间。
示例
本示例演示先获取DOS时间,再用dostounix()函数将其转换成UNIX时间,对UNIX时间加5*60s,即5分钟,然后将其转换成DOS时间显示。其具体代码如下:
运行结果如图7.7所示。
图7.7 用dostounix()函数转换时间格式 7.8 FP_OFF()——获取远指针的偏移量 FP_OFF()宏
实用程度:★★★☆☆
实例位置:配套资源\SL\07\08
FP_OFF()是一个宏,不是函数。其功能是获取32位远指针的低16位偏移量。
语法
define FP_OFF(fp) ((unsigned)(fp));
该宏的语法参数说明如下:
参数fp为32位远指针。
FP_OFF()宏的返回值:一个32位地址的低16位偏移量。
示例
本示例演示调用DOS中断建立文件夹,文件夹用字符串表示,字符串偏移地址通过FP_OFF()获取。其具体代码如下:
运行后,D:盘生成一个文件夹abc,如图7.8所示。
图7.8 建立文件夹 7.9 FP_SEG()——获取远指针的段地址 FP_SEG()宏
实用程度:★★★☆☆
实例位置:配套资源\SL\07\09
FP_SEG()是一个宏,不是函数。其功能是获取32位远指针的高16位段地址。
语法
define FP_SEG(fp) ((unsigned)((unsigned long)(fp) >> 16));
该宏的语法参数说明如下:
参数fp为32位远指针。
FP_SEG()宏的返回值:一个32位地址的高16位段地址。
示例
本示例演示调用DOS中断删除文件夹,文件夹用字符串表示,字符串段地址通过FP_SEG()获取。注意,只有空文件夹才能成功删除。其具体代码如下:
运行后,D:\abc被删除,如图7.9所示。
图7.9 删除文件夹(abc已经被删除) 7.10 freemem()——释放已分配DOS内存块函数 freemem()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\10
freemem()函数用于释放由allocmem()函数分配的DOS内存块。
语法
int freemem(unsigned segp);
freemem()函数的语法参数说明如下:
参数segp为先前分配的DOS内存块地址。
freemem()函数的返回值:成功返回0,不成功则返回-1。
示例
本示例演示用freemem()函数释放DOS内存块。其具体代码如下:
运行结果如图7.10所示。
图7.10 用freemem()函数释放DOS内存块 7.11 getcbrk()——获取Ctrl-Break设置函数 getcbrk()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\11
程序执行过程中按Ctrl+Break键可以中断程序执行,转而执行更紧急的任务,可以通过设置使程序不响应Ctrl-Break。setcbrk()函数用于设置程序是否响应Ctrl-Break,getcbrk()函数用于检查是否设置了该功能。
语法
int getcbrk();
getcbrk()函数没有参数。
getcbrk()函数的返回值:当Ctrl-Break已设置时为1,未设置时则为0。
示例
本示例演示先用setcbrk()函数设置Ctrl-Break状态,再用getcbrk()函数获取Ctrl-Break状态。其具体代码如下:
运行结果如图7.11所示。
图7.11 用getcbrk()函数获取Ctrl-Break状态 7.12 getdate()——获取DOS日期函数 getdate()函数
实用程度:★★★★☆
实例位置:配套资源\SL\07\12
getdate()函数用于获取系统当前的DOS日期,并将获取的日期存储于日期结构体中。
语法
void getdate(struct date *datep);
getdate()函数的语法参数说明如下:
参数datep为指向结果的日期型指针。
struct date 结构(在dos.h中)如下:
struct date {
int da_year; /年/ char da_day; /月/ char da_mon; /日/
}
getdate()函数没有返回值。
示例
本示例演示用getdate()函数获取系统当前日期。其具体代码如下:
运行结果如图7.12所示。
图7.12 用getdate ()函数获取当前日期 7.13 getdta()——获取磁盘传输地址函数 getdta()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\13
getdta()函数用于获取磁盘传输地址。
语法
char far*getdta(void);
getdta()函数没有参数。
getdta()函数的返回值:磁盘传输地址的指针。
示例
本示例演示创建磁盘文件并用getdta()函数获取磁盘传输地址。其具体代码如下:
运行结果如图7.13所示。
图7.13 用getdta()函数获取磁盘传输地址 7.14 gettime()——获取系统时间函数 gettime()函数
实用程度:★★★★☆
实例位置:配套资源\SL\07\14
gettime()函数用于获取系统时间。
语法
void gettime(struct time *timep);
gettime()函数的语法参数说明如下:
参数timep为保存系统时间的指针变量。
struct time 结构(在dos.h中)如下:
struct time {
unsigned char ti_min; /分钟/
unsigned char ti_hour; /小时/
unsigned char ti_hund; /百分之一秒/
unsigned char ti_sec; /秒/
}
gettime()函数没有返回值。
示例
本示例演示用gettime()函数获取系统时间。其具体代码如下:
运行结果如图7.14所示。
图7.14 用gettime()函数获取系统时间 7.15 inport()——从硬件端口中输入一个字函数 inport()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\15
inport()函数用于从硬件端口中输入一个字。
语法
int inport(int portid);
inport()函数的语法参数说明如下:
参数portid为端口号。
inport()函数的返回值:输入的数据。
示例
本示例演示用inport()函数从串口输入一个字。其具体代码如下:
运行结果如图7.15所示。
图7.15 用inport()函数从硬件端口输入一个字 7.16 inportb()——从硬件端口中输入一个字节函数 inportb()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\16
inportb()函数用于从硬件端口中输入一个字节。
语法
unsigned char inportb(int portid);
inportb()函数的语法参数说明如下:
参数portid为端口号。
inportb()函数的返回值:输入的数据。
示例
本示例演示用inportb()函数从串口输入一个字节。其具体代码如下:
运行结果如图7.16所示。
图7.16 用inportb()函数从硬件端口输入一个字节 7.17 int86()——通用8086软中断接口函数 int86()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\17
函数int86()用来执行指定的8086软中断。首先把输入指针所指的共用体中的内容复制到CPU的寄存器中,随即产生对应的中断,返回后将CPU寄存器(AX)的内容复制到输出指针指向的共用体中。在使用int86() 函数进行BIOS接口的系统调用时,有的中断调用设有若干选项,这些选项可以根据调用时AH寄存器中的值来进行访问。BIOS中断具有丰富的功能,详细功能请参阅汇编语言方面的书籍。
语法
int int86(int intno, union REGS inregs, union REGS outregs);
int86()函数的语法参数说明如下:
参数intno为中断号。
参数inregs为执行前寄存器的输入值。
参数outregs为执行后寄存器的输出值。
union REGS的定义(在dos.h中)如下:
struct WORDREGS{unsigned int ax, bx, cx, dx, si, di, cflag, flags;}
struct BYTEREGS{unsigned char al, ah, bl, bh, cl, ch, dl, dh;}
union REGS{struct WORDREGS x;struct BYTEREGS h;}
int86()函数的返回值:中断处理结束时的AX寄存器的值,错误时outregs->x.cflag!=0。
示例
本示例演示用int86()函数调用10H功能的06H子功能清除屏幕中的一个小块,清除块左上角坐标存入(cl, ch),右下角坐标存入(dl, dh)。其具体代码如下:
运行结果如图7.17所示。
图7.17 清除部分屏幕功能 7.18 int86x()——增强型通用8086软中断接口函数 int86x()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\18
函数int86x() 用来执行指定的8086软中断,与int86()函数的执行过程相同。二者功能的不同之处在于int86x()中可以使用段寄存器DS和ES,而int86()无此功能。
语法
int int86x(int intno, union REGS inregs, union REGS outregs, struct SREGS *segregs);
int86x()函数的语法参数说明如表7.1所示。
表7.1 参数说明
结构REGS定义见7.17节。
结构SREGS定义如下:
struct SREGS {unsigned int es, cs, ss, ds}
函数只用了该结构中的段寄存器DS和ES。调用时根据它们的值设置DS和ES,同时把DS和ES原来的值保存在该结构中,返回时再恢复DS和ES为原来的值。
int86x()函数的返回值:AX中的值。
示例
本示例演示用int86x()函数调用21H功能的3AH子功能删除文件夹,要删除文件夹地址先存入ds:dx,执行后CF=0表示删除成功。其具体代码如下:
运行结果如图7.18所示。
图7.18 删除文件夹 7.19 intdos()——通用DOS中断接口函数 intdos()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\19
intdos()函数用来执行指定的8086 DOS软中断,即21H中断功能。在7.17节中,如果把intno设置成21H(C语言写法为0x21),则两个函数的功能完全相同。
语法
int intdos(union REGS inregs, union REGS outregs);
intdos()函数的语法参数说明如下:
参数inregs为执行前寄存器的输入值。
参数outregs为执行后寄存器的输出值。
结构REGS的定义见7.17节。
如果需要功能号,则装入AH,如果需要子功能号,则装入AL。
intdos()函数的返回值:AX寄存器中的值。
示例
本示例演示用intdos()函数调用DOS功能的2AH子功能获取当前日期,执行后,cx保存年,dh保存月,dl保存日。其具体代码如下:
运行结果如图7.19所示。
图7.19 获取系统日期 7.20 intdosx()——增强型通用DOS中断接口函数 intdosx()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\20
intdosx()函数用来执行指定的8086 DOS软中断,即21H中断功能,与intdos()函数功能相近。不同之处在于intdosx()中可以使用段寄存器DS和ES,而intdos()无此功能。
语法
int intdosx(union REGS inregs, union REGS outregs, struct SREGS *segregs);
intdosx()函数的语法参数说明如下:
参数inregs为执行前寄存器的输入值。
参数outregs为执行后寄存器的输出值。
参数segregs为执行后DS、ES段寄存器的输出值。
结构REGS定义见7.17节。
结构SREGS定义见7.18节。
intdosx()函数返回值:AX寄存器中的值。
示例
本示例演示用intdosx()函数调用DOS功能的39H子功能创建文件夹,要创建文件夹地址先存入ds:dx,执行后CF=0表示创建成功。其具体代码如下:
运行结果如图7.20所示。
图7.20 用intdosx()函数调用系统中断实现创建文件夹功能 7.21 intr()——改变软中断接口函数 intr()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\21
intr()函数与int86x()函数实现的功能相同但接口参数不同,所有传入参数、传出参数均由一个参数完成。
语法
void intr(int intno, struct REGPAXK *preg);
intr()函数的语法参数说明如下:
参数intno为中断号。
参数preg为寄存器。
REGPACK定义如下:
struct REGPACK
{
unsigned r_ax, r_bx, r_cx, r_dx;
unsigned r_bp, r_si, r_di, r_ds, r_es, r_flag;
}
intr()函数本身没有返回值。
示例
本示例演示用intr()函数调用21H功能的3AH子功能删除文件夹,要删除文件夹地址先存入ds:dx,执行后CF=0表示删除成功。其具体代码如下:
运行结果如图7.21所示。
图7.21 删除文件夹 7.22 keep()——退出并继续驻留函数 keep()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\22
现在流行的Windows操作系统是一个多任务系统,CPU中可以有多个程序同时执行。DOS是一个单任务系统,CPU内只能运行一个程序,keep()函数可以让DOS程序退出后,一部分程序驻留内存,从而使新任务执行时,旧任务继续执行。
语法
void keep(unsigned char status, unsigned size);
keep()函数的语法参数说明如下:
参数status为返回DOS的错误识别码。
参数size为驻留程序使用内存的大小。
keep()函数没有返回值。
示例
本示例演示调用时钟中断在屏幕0行1列显示0~9之间的数字,退出程序前用keep()函数使其驻留内存,以后不论运行任何程序,屏幕左上角都会显示数字。注意程序的运行方式:在TC中编译成功后,退出TC,找到22.exe,在DOS提示符下输入22。以后运行其他DOS程序时,屏幕左上角始终显示0~9之间的数字。其具体代码如下:
运行结果如图7.22所示。
图7.22 屏幕左上角显示数字 7.23 MK_FP()——远指针合成 MK_FP()宏
实用程度:★★★☆☆
实例位置:配套资源\SL\07\23
MK_FP()是宏,不是函数。其功能是把一个16位段地址和另一个16位偏移地址合成一个32位地址。与FP_OFF()和FP_SEG()的功能正好相对。
语法
define MK_FP(seg, off) ((void far *)(((unsigned long)(seg) << 16) | (unsigned)(off)));
该宏的语法参数说明如下:
参数seg为16位段地址。
参数off为16位偏移地址。
MK_FP()宏的返回值:32位地址。
示例
本示例演示用DOS中断获取当前目录,结果保存在ds:si中,用MK_FP()把ds:si中的地址合成一个远指针。其具体代码如下:
运行结果如图7.23所示。
图7.23 获取当前目录 7.24 nosound()——关闭PC扬声器函数 nosound()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\24
sound()函数可以驱动PC扬声器发出声音,该声音只有执行nosound()函数时才会停止。
语法
void nosound(void);
nosound()函数没有参数。
nosound()函数没有返回值。
示例
本示例演示程序执行时会发出声音,1秒后声音消失。如果没有听到声音,请检查电脑扬声器是否安装正常。注意,发声设备不是多媒体音箱,而是PC扬声器。其具体代码如下:
7.25 outport()——从硬件端口中输出一个字函数
outport()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\25
outport()函数用于从硬件端口中输出一个字。
语法
void outport(int portid, int value);
outport()函数的语法参数说明如下:
参数portid为端口号。
参数value为输出数据。
outport()函数没有返回值。
示例
本示例演示用outport()函数向串行口输出一个数据。其具体代码如下:
运行结果如图7.24所示。
图7.24 用outport()函数输出数据 7.26 outportb()——从硬件端口中输出一个字节函数 outportb()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\26
outportb()函数用于从硬件端口中输出一个字节。
语法
void outportb(int portid, unsigned char value);
outportb()函数的语法参数说明如下:
参数portid为端口号。
参数value为输出数据。
outportb()函数没有返回值。
示例
本示例演示用outportb()函数向串行口输出一个数据。其具体代码如下:
运行结果如图7.25所示。
图7.25 用outportb()函数输出数据 7.27 parsfnm()——分析文件名函数 parsfnm()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\27
系统以文件控制块(fcb)管理文件,parsfnm()函数可通过文件控制块获取文件信息。
语法
char parsfnm(const char cmdline, struct fcb *fcb, int option);
parsfnm()函数的语法参数说明如下:
参数cmdline为命令行。
参数fcb为文件控制块指针。
参数option为选项。
struct fcb 结构如下:
parsfnm()函数的返回值:成功返回0,不成功则为非0值。
示例
本示例演示用parsfnm()函数获取文件信息。注意,只有打开后才能获取文件大小。其具体代码如下:
运行结果如图7.26所示。
图7.26 parsfnm ()函数获取文件信息 7.28 peek()——从存储单元读一个字函数 peek()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\28
peek()函数用于从内存任意单元读取一个字,如果在程序数据区内,完全没必要使用此函数,当在统一编址的设备中读取数据时,更显示出peek()函数的强大功能。
语法
int peek(unsigned segment, unsigned offset);
peek()函数的语法参数说明如下:
参数segment为段地址。
参数offset为偏移量。
peek()函数的返回值:读取出的值。
示例
本示例演示用peek()函数读取内存段地址0xB800 、偏移量(row80+col)2处的数据,0XB800为屏幕显示内存起始地址,每个显示单元占两个字节。其具体代码如下:
运行结果如图7.27所示。
图7.27 用peek()函数读取显示器数据 7.29 peekb()——从存储单元读一个字节的函数 peekb()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\29
与7.28节peek()函数的功能相近,不同之处在于peek()函数从内存任意单元读取一个字(两个字节),而peekb()函数从内存任意单元读取一个字节。
语法
char peekb(unsigned segment, unsigned offset);
peekb()函数的语法参数说明如下:
参数segment为段地址。
参数offset为偏移量。
peekb()函数的返回值:以上地址中的值。
示例
本示例演示用peekb()函数读取键盘功能键信息。其具体代码如下:
运行结果如图7.28所示。
图7.28 用peekb()函数获取键盘功能键状态 7.30 poke()——存一个字到给定存储单元函数 poke()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\30
poke()函数用于向内存任意单元存储一个字,如果在程序数据区内,完全没必要使用此函数,当在统一编址的设备中设取数据时,才显示出poke()函数的强大功能。
语法
void poke(unsigned segment, unsigned offset, int value);
poke()函数的语法参数说明如下:
参数segment为段地址。
参数offset为偏移量。
poke()函数没有返回值。
示例
本示例演示用poke()函数先输入一个屏幕位置,如果该处已有字符,则什么也不做,否则就在该处输出数据,并可以指定输出字符前景色、背景色。其具体代码如下:
运行结果如图7.29所示。
图7.29 用poke()函数设置屏幕显示 7.31 pokeb()——存一个字节到给定存储单元函数 pokeb()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\31
pokeb()函数的功能与poke()函数相近,不同之处在于poke()函数向内存任意单元存储一个字(两个字节),而pokeb()函数向内存任意单元存储一个字节。
语法
void pokeb(unsigned segment, unsigned offset, char value);
pokeb()函数的语法参数说明如下:
参数segment为段地址。
参数offset为偏移量。
pokeb()函数没有返回值。
示例
本示例演示用pokeb()函数先输入一个屏幕位置,如果该处没有任何输出,就在该处输出数据,否则什么也不做。与7.30节示例相比,该示例程序中不能指定输出字符前景色和背景色。其具体代码如下:
运行结果如图7.30所示。
图7.30 用pokeb()函数设置屏幕显示 7.32 randbrd()——随机块读函数 randbrd()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\32
randbrd()函数用于读取文件在磁盘中的任意数据块。
语法
int randbrd(struct fcb *fcb, int rcnt);
randbrd()函数的语法参数说明如下:
参数fcb为文件控制块。
参数rcnt为要读取的块数。
randbrd()函数的返回值:成功返回0,不成功则返回-1。
示例
本示例演示用randbrd()函数读文件的方法。其具体代码如下:
运行结果如图7.31所示。
图7.31 用randbrd()函数读磁盘文件 7.33 randbwr()——随机块写函数 randbwr()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\33
randbwr()函数用于在磁盘文件的任意数据块中写入数据。
语法
int randbwr(struct fcb *fcb, int rcnt);
randbwr()函数的语法参数说明如下:
参数fcb为文件控制块。
参数rcnt为要写入的块数。
randbwr()函数的返回值:成功返回0,不成功则返回-1。
示例
本示例演示用randbwr()函数写文件的方法。其具体代码如下:
运行时输入D:A.C,运行结束后,A.C文件的内容如图7.32所示。
图7.32 用randbwr ()函数写数据 7.34 segread()——读段寄存器值函数 segread()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\34
segread()函数用于读段寄存器值。
语法
void segread(struct SREGS *segp);
segread()函数的语法参数说明如下:
参数segp为段寄存器地址。
segread()函数没有返回值。
示例
本示例演示用segread()函数获取段寄存器地址。其具体代码如下:
运行结果如图7.33所示。
图7.33 获取段寄存器地址 7.35 setblock()——修改DOS分配地址函数 setblock()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\35
setblock()函数用于修改DOS分配地址。
语法
int setblock(unsigned segx, unsigned newsize);
setblock()函数的语法参数说明如下:
参数segx为DOS块地址。
参数newsize为新分配的DOS块大小。
setblock()函数的返回值:成功返回-1,不成功返回其他值。
示例
本示例演示用setbolck()函数重新分配DOS内存块。其具体代码如下:
运行结果如图7.34所示。
图7.34 修改DOS分配地址 7.36 setcbrk()——设置Ctrl-Break函数 setcbrk()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\36
程序执行过程中按Ctrl+Break键可以中断执行,转而执行更紧急的任务,可以通过设置使程序不响应Ctrl-Break。setcbrk()函数用于设置程序是否响应Ctrl-Break。
语法
int setcbrk(int cbrkvalue)
setcbrk()函数的语法参数说明如下:
参数cbrkvalue为1时,系统调用总是检查Ctrl-Break;为0时,只在控制台、打印、通信中检查Ctrl-Break。
setcbrk()函数的返回值:设置的cbrkvalue的值。
示例
本示例演示先用setcbrk()函数设置Ctrl-Break状态,再用getcbrk()函数获取Ctrl-Break状态。其具体代码如下:
运行结果如图7.35所示。
图7.35 设置Ctrl-Break状态 7.37 setdate()——设置DOS日期函数 setdate()函数
实用程度:★★★★☆
实例位置:配套资源\SL\07\37
setdate()函数用于设置DOS日期。
语法
void setdate(struct date *datep);
setdate()函数的语法参数说明如下:
参数datep为日期变量地址。
setdate()函数没有返回值。
示例
本示例演示用setdate()函数设置系统日期。其具体代码如下:
运行结果如图7.36所示。
图7.36 设置系统日期 7.38 settime()——设置DOS时间函数 settime()函数
实用程度:★★★★☆
实例位置:配套资源\SL\07\38
settime()函数用于设置DOS时间。
语法
void settime(struct time *timep)
settime()函数的语法参数说明如下:
参数timep为要设置的时间。
struct time 结构见7.14节。
settime()函数没有返回值。
示例
本示例演示用settime ()函数重新设置系统时间。其具体代码如下:
运行结果如图7.37所示。
图7.37 设置系统时间 7.39 setdta()——设置磁盘传输地址函数 setdta()函数
实用程度:★★☆☆☆
实例位置:配套资源\SL\07\39
setdta()函数用于设置磁盘传输地址。
语法
void setdta(char far *dta);
setdta()函数的语法参数说明如下:
参数dta为磁盘传输地址。
setdta()函数没有返回值。
示例
本示例演示用setdta()函数设置传输地址。其具体代码如下:
运行结果如图7.38所示。
图7.38 打开文件并设置传输地址 7.40 sleep()——以秒为单位的延时函数 sleep()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\40
sleep()函数用于产生以秒为单位的时间延迟。
语法
void sleep(unsigned secounds);
sleep()函数的语法参数说明如下:
参数secounds为用秒表示的延时时间。
sleep()函数没有返回值。
示例
本示例演示用sleep()函数来实现每隔一秒显示一个字母。其具体代码如下:
运行结果如图7.39所示。
图7.39 每隔1秒显示一个字符 7.41 sound()——打开PC扬声器函数 sound()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\41
sound()函数用于打开PC指示器,以指定音频发出声音。
语法
void sound(unsigned frequency);
sound()函数的语法参数说明如下:
参数frequency为音频。
sound()函数没有返回值。
示例
本示例演示用sound()函数设置不同音频,通过PC扬声器播放声音。如果没有听到声音,请检查电脑扬声器是否安装正常。注意,发声设备不是多媒体音箱,而是PC扬声器。其具体代码如下:
7.42 unixtodos()——把UNIX时间转换为DOS时间函数
unixtodos()函数
实用程度:★★★☆☆
实例位置:配套资源\SL\07\42
DOS时间是一个以年月日时分秒表示的时间,用结构体表示。UNIX时间是用一个长整数表示的时间,以秒计时。DOS时间用于显示数据比较方便,UNIX时间用于计算较方便。unixtodos()函数提供把UNIX时间转换为DOS时间的功能。
语法
void unixtodos(long time, struct date d, struct time t);
unixtodos()函数的语法参数说明如下:
参数time为UNIX 时间。
参数d为转换后的DOS日期。
参数t为转换后的DOS时间。
unixtodos()函数没有返回值。
示例
本示例演示先获取DOS日期,再用dostounix()函数将其转换成UNIX时间,对UNIX时间减去352460*60,即35天,然后将其转换成DOS时间显示出来。其具体代码如下:
运行结果如图7.40所示。
图7.40 通过UNIX时间进行时间计算