|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『楼 主』:
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(); //开中断;
}
|
|
2007-10-31 13:57 |
|
|
jojand
初级用户
积分 117
发帖 57
注册 2007-10-23
状态 离线
|
『第
2 楼』:
ctrl+break中断的返回不能用IRET,只能用RET
|
|
2007-10-31 15:29 |
|
|
eefui
新手上路
积分 2
发帖 1
注册 2007-10-31
状态 离线
|
|
2007-10-31 17:08 |
|
|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『第
4 楼』:
ctrl+break中断
To jojand
你说的情况有点不明白,ctrl+break中断中不能对文件操作,是因为ctrl+break中断的返回不能用IRET,只能用RET ? 如果这样的话 我还得查下IRET\RET 的用法呢? 小弟qq:36014789 希望得到你的指点
|
|
2007-11-1 09:03 |
|
|
jojand
初级用户
积分 117
发帖 57
注册 2007-10-23
状态 离线
|
『第
5 楼』:
即使使用非缓冲文件系统,也不能保证重入是安全的。
|
|
2007-11-1 14:45 |
|
|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『第
6 楼』:
To jojand
那该怎么处理呢?给个思路百
|
|
2007-11-2 13:55 |
|
|
jojand
初级用户
积分 117
发帖 57
注册 2007-10-23
状态 离线
|
『第
7 楼』:
一种方法是把ctrl+break中断挂到int28上,只有在产生int28期间才允许ctrl+break中断。
另一种方法是监视int21,在系统进入int21前先保存DOS的内部数据区,执行完后再恢复。但这种方法严重依赖DOS,不同版本的DOS的数据结构、数据位置不一样,使用起来有相当的难度。
|
|
2007-11-2 16:23 |
|
|
jojand
初级用户
积分 117
发帖 57
注册 2007-10-23
状态 离线
|
『第
8 楼』:
还有一种方法,监视int13,在int13完成后立即检查是否有ctrl+break中断,若有则执行中断,若无则返回。
总之,要想ctrl+break中断在各种情况下都能正常工作,起码要监视int10、int13、int16
|
|
2007-11-2 16:34 |
|
|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『第
9 楼』:
dos系统原先情况:
有个程序A在正常运行,产生数据存放到一文件A中。
设计需求:
现在有块板子,用的是8253做定时中断,他接的是IRQ3,中断能正常产生;现在我做了个中断驻留程序,想用irq3的中断对文件A操作。 我用ctrl+break中断模拟中断中的文件操作,老是死机,希望有能力的朋友共同帮忙解决;
小弟 愿用一个月的伙食费作为酬金!
QQ:36014789
|
|
2007-11-3 10:17 |
|
|
jojand
初级用户
积分 117
发帖 57
注册 2007-10-23
状态 离线
|
『第
10 楼』:
如果这样中断写文件,文件必定会产生错误
或许可以这样:
使IRQ3中断发生时置一个标志,再监视Int13,在每次调用int13前都检查一下IRQ3的中断标志,若有则调用关闭文件,若无则继续原来的操作。
[ Last edited by jojand on 2007-11-3 at 04:21 PM ]
|
在她弯下腰的瞬间 我彷佛看见 那神秘柔和的曲线 如云雾中岭壑的蜿蜒 |
|
2007-11-3 16:17 |
|
|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『第
11 楼』:
To jojand
我的设计流程合理吗?程序A和irq3的中断驻留程序 不能交互工作吗?
中断中到底能不能对文件操作呢
[ Last edited by xyh36014789 on 2007-11-5 at 11:36 AM ]
|
|
2007-11-5 11:33 |
|
|
jojand
初级用户
积分 117
发帖 57
注册 2007-10-23
状态 离线
|
『第
12 楼』:
程序只要能达到设计的目的就是合理。
在DOS里,在中断中操作文件绝对是不安全的。
|
在她弯下腰的瞬间 我彷佛看见 那神秘柔和的曲线 如云雾中岭壑的蜿蜒 |
|
2007-11-5 14:53 |
|
|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『第
13 楼』:
我有个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()
{
....
}
|
|
2007-11-6 10:38 |
|
|
xyh36014789
初级用户
积分 91
发帖 32
注册 2007-6-22
状态 离线
|
『第
14 楼』:
jojand
你QQ多少? 我有资料发你看下
|
|
2007-11-6 10:40 |
|