一种XENIX主控台屏幕文本动态截取方法


 

一种XENIX主控台屏幕文本动态截取方法

 

中国人民银行保山地区分行 周易达

(邮编:678000 电话:0875 2218361)

 

  在实际应用中,我们常需要将某些应用程序的屏幕画面文本动态截取下来。例如:在程序设计结束后,最重要地是编写操作手册。操作手册要求简明易懂,通俗直观,为了达到操作手册与程序运行同步,通常的作法是:把程序运行的屏幕过程,一清二楚地编写在手册中,再辅以简单说明。XENIX 虽然提供了重定向的操作手段,但存在着下列问题:

  一系列操作均处于盲打;

  所有屏幕从头到尾保留,不能动态截取;

  所保留的结果未按屏幕显示加换行符,因此不易编辑使用。

  为了减少工作量,帮助程序员尽快写出高质量的用户操作手册,笔者以C为开发工具,实现了XENIX

主控台屏幕文本的动态截取并存储到磁盘文件中(见程序清单)。下面对程序中涉及到的关键问题加以说明。

  屏幕文本的动态截取必须解决两个问题:

  动态截取程序一直驻留内存并保持活动态;

  动态截取程序通过热键激活并把当前屏幕文本存储到磁盘文件中;

  对于问题①,由于XENIX 是多用户、多任务系统,允许多个任务(进程)同时并存,因而将动态截取程序变成一个后台进程即可;

  对于问题②,可通过中断键(delete)来激活,用读屏写盘技术把屏幕文本存储到磁盘文件中。通过

XENIX 系统提供的信号捕捉函数signal(),来捕捉中断键信号SIGINT(指delete键),并通过函数指针指定捕捉到信号后的读屏写盘操作(s_v())。

  由于视频内存的地址在核心地址空间内,而应用程序只能在用户地址空间内操作,因而需要将核心地址空间的视频内存的地址映象到用户地址空间,ioctl()调用提供了在主控台上的这种地址映象的功能。在取得用户空间的地址映象后,便可将视频文本内容直接读出并写入磁盘文件中。

  在操作过程中,应先运行save_scr(),使其驻留内存,然后运行其他程序,此后,每当敲delete键,当前屏幕内容将自动追加到scr.txt 文件中,直到退出该XENIX 用户为止。

 

/*==>save_scr.c<==*/

#include <stdio.h>

#include <fcntl.h>

#include <time.h>

#include <signal.h>

#include <sys/ioctl.h>

char *addr;           /*显示缓冲区指针*/

s_v()              /*读屏写磁进程*/

{

int i,j;

long t;

FILE *fd;

struct tm *p;

char tb[10],*ptr,cp[300];

signal(SIGINT,s_v);       /*再次捕捉中断键信号*/

fd=fopen("scr.txt","a");    /*以追加的方式打开文本文件*/

ptr=addr;

for(j=0;j<24;j++) {

 for(i=0;i<80;i++) {

  cp[i]=*ptr++;        /*取出(j,i)的字符*/

  *ptr++; }          /*跳过字符属性不读*/

  cp[i]='\0';

  fprintf(fd,"%s\n",cp); }   /*写屏幕第j行到文本文件中*/

 fclose(fd);

}

main()

{

int fd;

fd=open("/dev/console",O_RDWR); /*打开主控台设备*/

if(fd<0){perror("open");exit(1);}

if((addr=(char *)ioctl(fd,MAPCONS,0L))==(char *)(-1)){

 perror("ioctl");exit(2); }  /*取地址映象*/

 signal(SIGINT,s_v);      /*捕捉中断键信号*/

 if(!fork()){         /*创建一个子进程*/

  signal(SIGINT,s_v);     /*捕捉中断键信号*/

  signal(SIGQUIT,SIG_IGN);  /*忽略退出键信号*/

  while(1); }

  exit(0);

}