协助C函数调用外部程序   为了实现某一特殊功能的程序,往往要书写很长的代码,有时还很难达到目 的。例如怎样将UCDOS6.0的wb.imd反编译为五笔字型字典源文件?怎样检查某一 内存驻留程序是否驻留等问题。实际上,系统已经提供了特定的程序来解决刚才 提到的问题,那么又怎样在自己的程序中利用这些系统程序呢?   在C语言里提供了三类调用外部程序的函数,各有不同的特点,还是从这三类 函数的特点和功能来着手分析。   一、system(char *command)函数。功能是执行一个MS-DOS命令,通过命令 解释程序command.com,来执行参数command字串中要求的命令,所以内存中会重 新加载一份command.com。例如可以在程序中用语句:system((command.com()来 实现MS-DOS的shell功能。   二、spawn类函数。此类函数功能较多,它能够由子进程返回父进程,接着运 行父进程,相比之下用途多些。下面就以spawn函数为例,说明C语言函数的重定 向功能怎样协助spawn系列函数来调用外部程序。   spawn系列函数的第一个参数int mode值确定调用函数(父进程),在调用 pawn后所采取的动作,mode的值为P _WAIT时,父进程被“挂起”直到子进程执行 完成,值为P_NOWAIT在MS-DOS下不可用,值为P_OVERYLAY同exec系列函数。 spawn系列函数后缀l、v、p、e表示父进程查找子进程时的路径,向子进程传递参 数是否可变、是否改变子进程的环境等信息。如spawlp(P_WAIT, (imdmng.exe(, (imdmng.exe(, (c:\\ucdos\\drv\\wb.imd(,(wb.txt(,NULL); 表示调用子进程 imdmng.exe,并在MS-DOS的path指定的查找路径查找imdmng.exe文件,参数个数 固定。   当在自己的程序中执行上面的函数调用时,Imdmng.exe会在屏幕上显示版本 信息,询问是否覆盖已存在的wb.txt文件,这些信息将破坏父进程的屏幕,把您 精心设计的屏幕窗口弄得乱七八糟。为了克服这种现象,我们可以利用C函数的重 定向功能,将输出从显示器重定向到磁盘文件,具体方法请参考下面C语言函数 create_wbtxt()。   #include   #include   #include   int create_wbtxt()   { FILE *fpout; char ucdir[MAXPATH+1],*p; int k;    printf(“\n输入UCDOS目录: "); gets(ucdir);    strcat(ucdir,“\\drv\\wb.imd");    printf(“\n正在生成UCDOS五笔字型编码字典源文件:WB.TXT......");    unlink(“wb.txt");    fpout=freopen(“crt.txt",“wt",stdout); /* 重定向标准输出到文件crt.txt */    k=spawnlp(P_WAIT,“imdmng.exe",“imdmng.exe",ucdir,“wb.txt",NULL);    fclose(fpout);    freopen(“CON",“a",stdout); /* 恢复标准输出为显示器 */    return k;   }/* 利用UCDOS提供的Imdmmng.exe生成五笔字典源文件wb.txt */   理解了函数create_wbtxt(),我们就很容易写出判断某程序是否驻留内存的 函数,请参考下面的C程序。   #include   #include   #include   main(int argc, char *argv[ ])   { int k;    k=in_memory(argv[1]); /* 检查某程序是否驻留内存 */    if(k==1)printf(“程序: %s 驻留内存\n", argv[1]);    else printf(“程序: %s 未驻留内存\n", argv[1]);   }   int in_memory(char *filename)   { FILE *fpout, *fp; int k; char s[80];    fpout=freopen(“crt.txt",“wt",stdout); /* 重定向标准输出到文件crt.txt */    k=spawnlp (P_WAIT, “mem.exe", “mem.exe", “/c", NULL);    fclose ( fpout );    freopen(“CON",“a",stdout); /* 恢复标准输出为显示器 */    if(k==-1) return -1;    fp=fopen (“CRT.TXT", “rt"); strupr ( filename );    while ( fgets(s,79,fp) ) if ( strstr(s, filename) ){ fclose (fp); return 1; }    fclose (fp); return 0;   } /* 函数返回 -1 出错, 0 内存中无filename, 1 filename驻留内存 */   用C语言编程时,通过利用C函数重定向功能,不仅能很好地控制屏幕输出, 利用它在子进程与父进程之间进行数据通讯也是很方便的。上面提供的int in_memory(char * ) 函数,就实现了与mem.exe程序的通讯,从而判断某程序是 否驻留内存。然而对某些需要从键盘输入的程序,如果利用C函数重定向后,您还 得考虑如何处理键盘缓冲区来响应这类程序。   以上函数,在MS-DOS 6.22、UCDOS 6.0系统下,用Turbo C 2.0上机调试通过。