一种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,
perror("ioctl");exit(2); } /*取地址映象*/
signal(SIGINT,s_v); /*捕捉中断键信号*/
if(!fork()){ /*创建一个子进程*/
signal(SIGINT,s_v); /*捕捉中断键信号*/
signal(SIGQUIT,SIG_IGN); /*忽略退出键信号*/
while(1); }
exit(0);
}