中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
作者:
标题: dos下的ctrl+break中断? 上一主题 | 下一主题
xyh36014789
初级用户





积分 91
发帖 32
注册 2007-6-22
状态 离线
『楼 主』:  dos下的ctrl+break中断? 使用 LLM 解释/回答一下

本人有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 楼』:   使用 LLM 解释/回答一下

ctrl+break中断的返回不能用IRET,只能用RET


2007-10-31 15:29
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
eefui
新手上路





积分 2
发帖 1
注册 2007-10-31
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

哦...醬要去試一下


2007-10-31 17:08
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
xyh36014789
初级用户





积分 91
发帖 32
注册 2007-6-22
状态 离线
『第 4 楼』:  ctrl+break中断 使用 LLM 解释/回答一下

To jojand

你说的情况有点不明白,ctrl+break中断中不能对文件操作,是因为ctrl+break中断的返回不能用IRET,只能用RET ? 如果这样的话 我还得查下IRET\RET 的用法呢? 小弟qq:36014789 希望得到你的指点


2007-11-1 09:03
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jojand
初级用户





积分 117
发帖 57
注册 2007-10-23
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

即使使用非缓冲文件系统,也不能保证重入是安全的。


2007-11-1 14:45
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
xyh36014789
初级用户





积分 91
发帖 32
注册 2007-6-22
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

To jojand
那该怎么处理呢?给个思路百


2007-11-2 13:55
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jojand
初级用户





积分 117
发帖 57
注册 2007-10-23
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

一种方法是把ctrl+break中断挂到int28上,只有在产生int28期间才允许ctrl+break中断。
另一种方法是监视int21,在系统进入int21前先保存DOS的内部数据区,执行完后再恢复。但这种方法严重依赖DOS,不同版本的DOS的数据结构、数据位置不一样,使用起来有相当的难度。


2007-11-2 16:23
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jojand
初级用户





积分 117
发帖 57
注册 2007-10-23
状态 离线
『第 8 楼』:   使用 LLM 解释/回答一下

还有一种方法,监视int13,在int13完成后立即检查是否有ctrl+break中断,若有则执行中断,若无则返回。

总之,要想ctrl+break中断在各种情况下都能正常工作,起码要监视int10、int13、int16


2007-11-2 16:34
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
xyh36014789
初级用户





积分 91
发帖 32
注册 2007-6-22
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

dos系统原先情况:
有个程序A在正常运行,产生数据存放到一文件A中。

设计需求:
现在有块板子,用的是8253做定时中断,他接的是IRQ3,中断能正常产生;现在我做了个中断驻留程序,想用irq3的中断对文件A操作。 我用ctrl+break中断模拟中断中的文件操作,老是死机,希望有能力的朋友共同帮忙解决;

小弟 愿用一个月的伙食费作为酬金!
QQ:36014789


2007-11-3 10:17
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jojand
初级用户





积分 117
发帖 57
注册 2007-10-23
状态 离线
『第 10 楼』:   使用 LLM 解释/回答一下

如果这样中断写文件,文件必定会产生错误

或许可以这样:
使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 楼』:   使用 LLM 解释/回答一下

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 楼』:   使用 LLM 解释/回答一下

程序只要能达到设计的目的就是合理。
在DOS里,在中断中操作文件绝对是不安全的。




在她弯下腰的瞬间 我彷佛看见 那神秘柔和的曲线 如云雾中岭壑的蜿蜒
2007-11-5 14:53
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
xyh36014789
初级用户





积分 91
发帖 32
注册 2007-6-22
状态 离线
『第 13 楼』:   使用 LLM 解释/回答一下

我有个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 楼』:   使用 LLM 解释/回答一下

jojand
你QQ多少? 我有资料发你看下


2007-11-6 10:40
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: