中国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中断?

本人有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
状态 离线
『第 3 楼』:  

哦...醬要去試一下

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
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: