![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-19 01:20 |
共 47,814 主题排行 / 349,908 发帖 / 今日 1 篇 / 48,259 会员排行 |
| DOS疑难解答 & 问题讨论 (解答室) » dos下的ctrl+break中断? |
| 可打印版本 1,131 / 13 |
| 第1楼 xyh36014789 | 发表于 2007-10-31 13:57 |
| 初级用户 发帖 32 积分 91 | |
|
dos下的ctrl+break中断? 本人有dos系统,想用它的ctrl+break中断,在它的中断服务程序中进行文件操作,就是读一文件,写到另一个文件中。可是在操作文件时,老是司机,不知道为何原因。请各位大人不吝执教!QQ:36014789
程序如下 #include <stdio.h> #include <dos.h> #include <conio.h> #include <process.h> #include <sys b.h> #include <fcntl.h> #include <sys\stat.h> #include <share.h> #include <IO.H> #ifdef __cplusplus #define __ARGU ... #else #define __ARGU #endif void interrupt (*oldhandler)(void); /*函数声明*/ void interrupt newint(__ARGU); /*函数声明*/ void install (void interrupt (*fadd)(__ARGU), int num); main() { install (newint,0x1b); /*Ctrl+Break中断号:1BH*/ keep(0,_SS+(_SP/16)-_psp); /*驻留程序*/ return 0; } void interrupt newint(__ARGU) { int fd1=-1; //读文件号,由open函数返回; int fd2=-1; //写文件号,由open函数返回; int read_res=-1; //read函数返回值,-1表示出错; int write_res=-1; //write函数返回值,-1表示出错; char buf[10]; //缓冲区; //读文件号,由open函数返回; disable(); fd1=open("c:\\fr.txt", O_CREAT | O_TRUNC | O_TEXT, S_IREAD|S_IWRITE); fd2=open("c:\\fw.txt", O_CREAT | O_TRUNC | O_TEXT, S_IREAD|S_IWRITE); if(fd1==-1||fd2==-1) puts("Open file failure!\n"); else { puts("Open files success!\n"); //不能用fseek函数,牵涉到dos重入问题,只能用非缓冲文件系统函数; lseek(fd1,0,SEEK_SET);//移动文件位置指针到指定位置; //不能用fread函数,牵涉到dos重入问题,只能用非缓冲文件系统函数; read_res=read(fd1,buf,COUNT); //读文件函数; if(read_res==-1) //如果读文件失败; puts("Read file failure!\n"); else { puts("Read files success!\n"); //不能用fseek函数,牵涉到dos重入问题,只能用非缓冲文件系统函数; lseek(fd2,0,SEEK_SET);//移动文件位置指针到指定位置; //不能用fwrite函数,牵涉到dos重入问题,只能用非缓冲文件系统函数; write_res=write(fd2,buf,COUNT); //写文件函数; if(write_res==-1) //如果写文件失败; puts("Write file failure!\n"); else puts("Write files success!\n"); } close(fd1); //关闭文件; close(fd2); //关闭文件; } enable(); } void install (void interrupt (*fadd)(__ARGU), int num) { disable(); //禁止中断; setvect(num,fadd); /*设置中断*/ enable(); //开中断; } |
|
| 第2楼 jojand | 发表于 2007-10-31 15:29 |
| 初级用户 发帖 57 积分 117 | |
|
ctrl+break中断的返回不能用IRET,只能用RET
|
|
| 第3楼 eefui | 发表于 2007-10-31 17:08 |
| 新手上路 发帖 1 积分 2 | |
|
哦...醬要去試一下
|
|
| 第4楼 xyh36014789 | 发表于 2007-11-01 09:03 |
| 初级用户 发帖 32 积分 91 | |
|
ctrl+break中断 To jojand
你说的情况有点不明白,ctrl+break中断中不能对文件操作,是因为ctrl+break中断的返回不能用IRET,只能用RET ? 如果这样的话 我还得查下IRET\RET 的用法呢? 小弟qq:36014789 希望得到你的指点 |
|
| 第5楼 jojand | 发表于 2007-11-01 14:45 |
| 初级用户 发帖 57 积分 117 | |
|
即使使用非缓冲文件系统,也不能保证重入是安全的。
|
|
| 第6楼 xyh36014789 | 发表于 2007-11-02 13:55 |
| 初级用户 发帖 32 积分 91 | |
|
To jojand
那该怎么处理呢?给个思路百 |
|
| 第7楼 jojand | 发表于 2007-11-02 16:23 |
| 初级用户 发帖 57 积分 117 | |
|
一种方法是把ctrl+break中断挂到int28上,只有在产生int28期间才允许ctrl+break中断。
另一种方法是监视int21,在系统进入int21前先保存DOS的内部数据区,执行完后再恢复。但这种方法严重依赖DOS,不同版本的DOS的数据结构、数据位置不一样,使用起来有相当的难度。 |
|
| 第8楼 jojand | 发表于 2007-11-02 16:34 |
| 初级用户 发帖 57 积分 117 | |
|
还有一种方法,监视int13,在int13完成后立即检查是否有ctrl+break中断,若有则执行中断,若无则返回。
总之,要想ctrl+break中断在各种情况下都能正常工作,起码要监视int10、int13、int16 |
|
| 第9楼 xyh36014789 | 发表于 2007-11-03 10:17 |
| 初级用户 发帖 32 积分 91 | |
|
dos系统原先情况:
有个程序A在正常运行,产生数据存放到一文件A中。 设计需求: 现在有块板子,用的是8253做定时中断,他接的是IRQ3,中断能正常产生;现在我做了个中断驻留程序,想用irq3的中断对文件A操作。 我用ctrl+break中断模拟中断中的文件操作,老是死机,希望有能力的朋友共同帮忙解决; 小弟 愿用一个月的伙食费作为酬金! QQ:36014789 |
|
| 第10楼 jojand | 发表于 2007-11-03 16:17 |
| 初级用户 发帖 57 积分 117 | |
|
如果这样中断写文件,文件必定会产生错误
或许可以这样: 使IRQ3中断发生时置一个标志,再监视Int13,在每次调用int13前都检查一下IRQ3的中断标志,若有则调用关闭文件,若无则继续原来的操作。 [ Last edited by jojand on 2007-11-3 at 04:21 PM ] |
|
| 第11楼 xyh36014789 | 发表于 2007-11-05 11:33 |
| 初级用户 发帖 32 积分 91 | |
|
To jojand
我的设计流程合理吗?程序A和irq3的中断驻留程序 不能交互工作吗? 中断中到底能不能对文件操作呢 [ Last edited by xyh36014789 on 2007-11-5 at 11:36 AM ] |
|
| 第12楼 jojand | 发表于 2007-11-05 14:53 |
| 初级用户 发帖 57 积分 117 | |
|
程序只要能达到设计的目的就是合理。
在DOS里,在中断中操作文件绝对是不安全的。 |
|
| 第13楼 xyh36014789 | 发表于 2007-11-06 10:38 |
| 初级用户 发帖 32 积分 91 | |
|
我有个irq3得中断,硬件已经初始化了,可以产生中断,但是程序感觉着还是不太完整,不知道那里需要补充?
下面程序就是irq3实现定时器定时中断功能,现在是打印“Welcome to JHW of ZhengZhou" (本来是用来定时操作文件的),如果开机运行该程序的话,完全没有问题,可是只要我按下键盘,程序就停止,不知道为何?是不是在程序中的没有考虑键盘中断的影响呢?不知道该怎么接管int 13H int 28H #include <stdio.h> #include <dos.h> #include <conio.h> #include <process.h> #include <sys/timeb.h> #include <fcntl.h> d4 #include <sys\stat.h> #include <share.h> #include <IO.H> #define INTR 0X0b #define Freq1 400 #define Freq2 10000 #define Data1_add 0x2bc #define Data2_add 0x2bd #define Control_add 0x2bf #ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif void interrupt ( *oldhandler)(__CPPARGS); void interrupt handler(__CPPARGS); void init8253(); void install_newtimer(); int main(void) { install_newtimer();//安装中断 init8253(); //初始化 keep(0,_SS+(_SP/16)-_psp); //驻留 return 0; } //安装中断 void install_newtimer() { disable(); oldhandler = getvect(INTR); setvect(INTR, handler); zd=inportb(0x21); delay(1); outportb(0x21,zd&~(0x08)); enable(); } //中断函数 void interrupt handler(__CPPARGS) { disable(); puts("Welcome to JHW of ZhengZhou\n"); //是不是应该有个返回呢??????? outportb(0x20,0x20); enable(); } //硬件初始化 已经成功 void init8253() { .... } |
|
| 第14楼 xyh36014789 | 发表于 2007-11-06 10:40 |
| 初级用户 发帖 32 积分 91 | |
|
jojand
你QQ多少? 我有资料发你看下 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |