Unix系列shell程序编写Windows系统

2024-05-09

Unix系列shell程序编写Windows系统(精选6篇)

篇1:Unix系列shell程序编写Windows系统

MI LY: “ times=”“ new=”“ roman?;=”“ mso-fareast-font-family:=”“ 宋体;=”“ mso-font-kerning:=”“ 1.0pt;=”“ mso-ansi-language:=”“ en-us;=”“ mso-fareast-language:=”“ zh-cn;=”“ mso-bidi-language:=”“ ar-sa?=”“>Shell 是什么 ? 任何发明都具有供用户

MILY: ” times=“” new=“” roman?;=“” mso-fareast-font-family:=“” 宋体;=“” mso-font-kerning:=“” 1.0pt;=“” mso-ansi-language:=“” en-us;=“” mso-fareast-language:=“” zh-cn;=“” mso-bidi-language:=“” ar-sa?=“”>Shell是什么?

任何发明都具有供用户使用的界面,UNIX供用户使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要强大的多),

Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。

为了不同的需要,UNIX提供了不同的Shell。现在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)为例,一步步的领略UNIX Shell的强大功能,占先其强大魅力,达到更方便灵活的管理、应用UNIX的目的。

下载地址,见下:(不断更新中)

01.pdf

02.pdf

03.pdf

04.pdf

05.pdf

06.pdf

07.pdf

08.pdf

............不断上传中..........

原文转自:www.ltesting.net

篇2:Unix系列shell程序编写Windows系统

MILY: ” times=“” new=“” roman?;=“” mso-fareast-font-family:=“” 宋体;=“” mso-font-kerning:=“” 1.0pt;=“” mso-ansi-language:=“” en-us;=“” mso-fareast-language:=“” zh-cn;=“” mso-bidi-language:=“” ar-sa?=“”>Shell是什么?

任何发明都具有供用户使用的界面,UNIX供用户使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要强大的多),

Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。

为了不同的需要,UNIX提供了不同的Shell。现在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)为例,一步步的领略UNIX Shell的强大功能,占先其强大魅力,达到更方便灵活的管理、应用UNIX的目的。

下载地址,见下:(不断更新中)

01.pdf

02.pdf

03.pdf

04.pdf

05.pdf

06.pdf

07.pdf

08.pdf

............不断上传中..........

篇3:Unix系列shell程序编写Windows系统

Unix系统中性能优化以及确定系统中的性能瓶颈是系统管理员的主要任务之一。在一个计算机系统中, CPU、内存、硬盘和网络是影响系统性能的主要因素, 因此系统性能的监控以及调整也主要在于如何在这些资源中获得某种平衡, 以满足人们对系统性能的期望。

IBM小型机RS6000在企业应用中被广泛采用, 其上的AIX操作系统如同其它UNIX系统一样, 给系统管理员监控系统提供了非常丰富的手段。这里就以AIX系统中的几个监控工具为例, 利用shell程序及定时作业程序cron及强大的awk工具, 实现统计系统资源利用率, 可以每天统计内存的日均使用率、CPU的每日峰值、CPU的日均使用率, 并使每月统计量根据月中每日数据平均得出, 每月1号凌晨产生上月统计数据, 这样就可给系统管理员了解系统运行资源的率用率提供很好的参考。其中提到的系统工具Vmstat、svmon、awk等都很强大, 限于篇幅不作非常详细的介绍, 如想更透彻地了解这些命令的用法, 请参考有关技术资料或手册。

二、AIX中的性能监控工具

一个系统要为用户提供持续高可用性的服务, 不仅仅只要求它能够正常运行, 而且还要使其性能处于最佳状态。系统管理员的职责之一就是对系统进行性能统计分析, 掌握系统的运行状态和资源使用情况, 然后通过合理配置系统资源, 使系统健康运行。

从系统管理的角度看, 性能的管理主要集中在现有资源的分配利用上, 这些资源包括物理资源和逻辑资源。物理资源包括了CPU、内存、I/O设备, 逻辑设备包括逻辑卷管理器、虚拟内存管理器、系统资源控制器和文件系统等。这里重点介绍一些关于系统性能的命令和工具。

(一) iostat

iostat命令主要通过观察物理磁盘的活跃时间以及他们的平均传输速度, 监控系统输入/输出设备负载。根据iostat命令产生的报告, 用户可确定一个系统配置是否平衡, 并据此在物理磁盘与适配器之间更好地平衡输入/输出负载。

(二) netpmon

netpmon命令可以监控关于网络行为的系统事件和性能以及网络行为对CPU的消耗。netpmon命令在指定的监控周期报告网络行为。

(三) ps工具

ps命令是UNIX系统中最常见的命令, 它主要显示系统中关于进程的统计和状态信息, 如进程ID, I/O行为以及CPU利用率等。利用ps命令提供的信息, 可决定一个进程运行了多长时间, 进程使用了多少CPU时间, 以及进程是否受系统的惩罚。还可用ps命令确定进程使用了多少内存, 完成多少I/O, 进程的优先级以及是谁创建了进程。

(四) vmstat

vmstat命令报告关于核心线程, 虚拟内存, 自陷 (trap) , 磁盘以及CPU行为的统计。而且每种行为报告都被更细致地用百分比分别表示用户态、核态、空闲以及等待磁盘I/O等情况。

内核维持了对核心线程, 换页以及中断行为的统计数据, 而vmstat命令则通过使用knlist子程序和/dev/kmen伪设备驱动器访问这些数据。磁盘的输入/输出统计是通过设备驱动器维持的。对于磁盘, 平均传输速度是通过使用活跃时间核传输信息数目决定的。而活跃时间百分比则是从报告期间驱动器忙的时间量计算出来的。

(五) sar

sar命令报告CPU的使用情况, I/O以及其它系统行为。sar命令可以收集, 报告以及保存系统行为信息。如果没有指定输入文件, 则sar调用sarc命令访问系统数据。

用户可用让cron命令运行两个shell脚本 (/usr/lib/sa/sa1和/usr/lib/sa2) 以提供日统计和报表。在crontab文件/var/spool/cron/crontabs/adm中包括了一些样本节, 用于示范cron要在何时运行这些shell脚本。以这种方式收集到的数据对于确定系统的时间周期特征和决定峰值使用时间是很有用的。

但要注意的是, sar命令自己运行时会产生相当数量的读写。因此最好在没有工作量的情况下运行sar统计, 看看sar对总的统计数字有多大的影响。

(六) topas

topas命令用于监控各种系统资源, 如CPU的使用情况, CPU事件和队列, 内存和换页空间的使用, 磁盘性能, 网络性能以及NFS统计等。它还会报告指派给不同WLM类的进程对系统资源的消耗情况。它还能报告系统中最热门的进程和工作量管理器 (WLM) 的热门类。有关WLM类信息只有在WLM激活时才会显示。topas命令将热门进程定义为那些使用大量CPU时间的进程。topas命令没有作日志的选项, 所有信息都是实时的。

(七) truss

truss命令跟踪一个进程的系统调用、所接收的信号以及招致的机器错。要检查的应用程序可在truss命令的命令行中指定, 也可将truss命令挂在一个或多个已经在运行的进程上。

(八) svmon

svmon命令用于显示当前内存的状态。其可以捕捉和分析虚拟内存的快照信息, 所有的统计都是以4k内存页面为单位进行的。

三、系统利用率统计脚本程序

(一) 统计程序的简介

此系统利用率统计脚本程序由stat.sh、setup.sh组成, 仅在AIX 4.3.3与5.2环境中测试通过, 尚不支持其他UNIX服务器。推荐将两脚本置于/stat目录, 确保root对两文件具有执行权限 (cd/stat;chmod 755*.sh) 。可运行setup.sh脚本, 此脚本将直接在root的crontab中添加一项。每晚23:55执行stat.sh。脚本默认输出到/tmp/stat目录, result.lst为日均统计值, 输出格式为

“日期内存日均使用率%CPU每日峰值%CPU日均使用率%”

每月统计量根据月中每日数据平均得出, 每月1号凌晨产生上月统计数据并输出至report.lst。

脚本中关于crontab、awk的使用说明及shell编程的方法请查阅相关技术文档。

(二) setup.sh脚本

在系统的命令行中执行setup.sh, 将/stat/stat.sh添加到root用户的cron定时作业项中, 添加文件名为/var/spool/cron/crontabs/root。否则报出定时作业已经存在。代码如下:

(三) stat.sh脚本

此脚本使用AIX提供的两个重要系统性能工具vmstat和svmon分别收集cpu和内存的一整天的运行统计数据。为了不影响系统的运行, 设定为在定时作业cron中每60秒执行一次, 全天24小时运行, 并将数据保存到cpu.日期和mem.日期文件中, 以便于当天23:55分运行后使用awk工具进行一天的统计计算。

众所周知, awk进行文本处理是逐行处理的, 所以只需要设置计数器cnt变量进行累加以便于计算cpu和内存的平均利用率。我们以内存平均利用率的算法进行说明, 其他算法的产生与其相类似。

内存平均利用率的算法为:

设置cnt、delta、tbase、base变量初始为零, cnt为行计数变量, delta保存内存使用变化量, tbase为cron时间点上内存使用量, base为总内存量。

从mem.日期文件第一行开始, 如果base为0, 则将$2、$3域的值赋给base和tbase。然后进行cnt++下一行处理, 即将新时间点上的内存使用量减去上一时间点的内存使用量, 并将结果赋给delta变量自加:

直至最后一行, 进行100* (tbase+delta/cnt) /base即可得到当天的内存平均使用率了。

程序的源代码如下:

四、总结

综上所述, 在unix系统中, 提供了非常强大的系统监控工具。可利用这些工具并结合shell脚本的便利, 编制非常方便实用的监控程序, 并得到及时详细的系统性能统计信息。系统管理员可根据这些数据, 利用系统性能的调制工具, 例如f d p r、schedtune、vmtune等, 对系统的内核参数作出逻辑资源上的调整或者对硬件资源升级, 以此保障应用系统的安全稳定运行。

摘要:本文简要阐述了unix系统中 (主要以IBM的AIX为例) 进行系统性能管理的几种命令行工具, 并通过编写shell实例程序, 运用其中提到的工具实现系统资源利用率的统计程序, 为做好unix系统管理和调优提供参考。

篇4:Unix系列shell程序编写Windows系统

本文Shell程序运行环境:

◆程序运行环境Redhat Linux As3

◆GNU bash, version 2.05b.0(1)-release (i386-redhat-linux-gnu)

◆代码清单:shellcode.txt

问题描述:有一个普通的通话话单文件(包括“计费号码”,“主叫号码”,“被叫号码”,“开始时间”,“结束时间”,“时长”,“费用”等其它字段),要求根据另外一个号段配置文件(由“号段下限”和“号段上限”两个字段组成)将此话单文件进行分拣过虑,

分拣规则:如果通话话单文件中的“计费号码”位于号段文件的某个号段内,则将此条记录计入结果文件1,否则计入结果文件2。

通话话单文件样例:

901333|9013320003|9918128025|0814163420|20060814163450|30|20|00|01|005

9926645208|9926645208|9918188065|20060814163415|20060814163545|90|30|00|01|005

9934877207|9934877207|993697|20060814163620|20060814163930|190|50|00|01|005

......

......

号段配置文件样例:

9013305000,9013327999

9013767000,9013768999

9923670000,9923679999

9928998000,9928999999

9932310000,993239

9932333400,9932333599

9936034000,9936036999

9936084000,9936084999

9998537000,9998537999

9998620000,9998629999

9998690000,9998699999

例如:

对于通话话单文件的第一条记录中的“计费号码”为9013320000,此号码正好属于号段配置文件的第一个号段9013305000,9013327999中,即:条件9013305000<= 9013320000 <=9013327999成立,所以应该将通话话单文件的第一条记录计入结果文件1中;对于通话话单文件中的第二条记录的“计费号码”为9926645208它不属于号段文件中的任何一个段,所以应该将通话话单的第二条记录计入结果文件2中。

对于这样一个简单的问题首先想到的解决方法为:

解决方法1:

写一个双重循环,外层循环为逐条读取“通话话单文件”并获取每条记录的第一个字段的值“计费号码”,内层循环:根据外层循环获得的“计费号码”在“号段文件”中循环比较,判断此号码是否属于相应号段。

程序代码如下(省略了文件存在性判断等语句):

while read f

do

rg=“$(expr substr ${f} 1 10)”#取得“计费号码”存入变量org中

while read numseg

do

nglow=“$(expr substr ${numseg} 1 10 )”#将号段下限存入变量nglow

ngtop=“$(expr substr ${numseg} 12 10 )”#将号段上限存入变量ngtop

if [ “$org” > “$nglow”-a “$org” < $ngtop ]

#判断“计费号码”是否在此号段内

then

echo “${f}” >>./resultfile1.cdr #如果在此号段内,将此记录计入结果文件1中

else

echo “${f}” >>./resultfile2.cdr #如果不在此号段内,将此记录计入结果文件2中

fi

done < ./numseg.txt

done < ./rttest.txt

解决方法1对于号段文件和通话话单的记录数都比较少的情况下基本可以完成工作,但是当两个文件的记录数较多(例如号段文件>50条,话单文件>10000条)的时候,这种方法就会花费几个小时甚至几天的时间才能得出处理结果。此脚本程序执行慢的原因是对第二个循环内的比较运算只用了最简单的顺序比较方法,所以当号段文件的记录增多的时候,脚本的执行速度会急剧下降。

解决方法2:

将内层循环的逐个比较的方法改为二分查找法进行判断,程序代码如下:

#!/bin/bash

#Author Xshdate:08-15-2006

#程序中使用了二分查找法进行号码的范围判断

#为突出重点,省略了文件存在性判断和异常捕获以及帮助提示等程序语句

#程序的工作目录为当前目录

echo “Time:$(date)==>Strat to processing.........” #显示程序开始运行时间

while read numseg

do

tmplow=“${tmplow} $(expr substr ${numseg} 1 10 & >/dev/null ) ”

tmptop=“${tmptop} $(expr substr ${numseg} 12 10 & >/dev/null ) ”

done < ./numseg.txt

#读取号段文件,下限号段存入变量tmplow,上限号段存入变量tmptop

arr_lownug=(${tmplow}) #将下限号段存入数组arr_lownug

arr_topnug=(${tmptop})#将上限号段存入数组arr_topnug

#定义函数checknum,输入参数为需要检查的“计费号码”,输出参数为0或者1

#若checknum()输出为0 表示“计费号码” 不在号段文件的所有号段范围内

#若checknum()输出为1 表示“计费号码” 在号段文件的所有号段范围内

# checknum()函数中用二分搜索法进行号码的判断

checknum(){

thisnum=$1

ckresult=0

lowflag=0

topflag=$(expr ${#arr_lownug[*]} - 1 )#标注1

MaxIndex=$(expr ${#arr_topnug[*]} - 1 ) #标注2

midflag=0

midflag=$(expr ${topflag} / 2 )#标注3

if [ “${thisnum}” < “${arr_lownug[0]}” -o “${thisnum}” >

“${arr_topnug[${MaxIndex}]}”]

then

return 0

else

while [ “$lowflag” != “$midflag” ]

do

if[ “$thisnum” > “${arr_lownug[${midflag}]}” -o “$thisnum” ==

“${arr_lownug[${midflag}]}” ]

then

lowflag=${midflag}

midflag=$(expr `expr ${topflag} + ${lowflag}` / 2 ) #标注4

elif[“$thisnum”<“${arr_lownug[${midflag}]}” -o “$thisnum” ==

“${arr_lownug[${midflag}]}” ]

then

topflag=${midflag}

midflag=$(expr `expr ${topflag} + ${lowflag}` / 2 ) #标注5

else

echo “Error!”

fi

done

if [ “$thisnum” < “${arr_topnug[${lowflag}]}” -o “$thisnum” ==

“${arr_topnug[${lowflag}]}” ]

then

return 1

else

return 0

fi

fi

}#函数定义完毕

while read f

do

rg=“$(expr substr ${f} 1 10)” #标注6

checknum ${org}

returnval=$?

if [ “$returnval” == “1”]

then

echo “${f}” >>./Match_result.cdr#将匹配的记录存入结果文件1

else

echo “${f}” >>./NoMatch_result.cdr #将不匹配的记录存入结果文件2

fi

done < ./rttest.txt

echo “Time:$(date) ==>Proclearcase/” target=“_blank” >ccess is end! “

exit 0;

共2页: 1 [2] 下一页

篇5:Unix系列shell程序编写Windows系统

clear

echo “”

echo “系统将要终止打印机进程.”

lpstat -u >/etc/pp

if [ -s /etc/pp ]

then

list=`cat /etc/pp | awk ’{print $1}’`

echo “请稍候......”

for jjj in $list

do

cancel $jjj

done

else

echo “”

echo “07没有打印机进程!!!”

fi

prompt

read key

}

bzzyg 回复于:-02-20 09:30:50不错

mazhedong 回复于:2003-07-29 10:21:33真是不错的

ibmxp 回复于:2003-08-01 23:40:13顶!

geekchi 回复于:2003-08-03 22:25:05这样写更简单:

cancel `lpstat | cut -c1-10 `

iamzoe 回复于:2003-12-10 17:18:48我试过了可是不行呀,一开始就有的错误提示了

iamzoe 回复于:2003-12-10 17:20:30[quote=“geekchi”]这样写更简单:

cancel `lpstat | cut -c1-10 `[/quote]

系统会把‘’里面的东东当作字符串处理,

终止打印机进程的shell程序Windows系统

篇6:Unix系列shell程序编写Windows系统

第二章 基于Object UNIX Class Library的应用程序基础

第一章已经介绍了Object UNIX Class Library类库,接下来便可以开始构造简单的Object UNIX Class Library程序了。在后面几章,将讲述UNIX环境下文本窗口、交互式UNIX程序、包括菜单、对话框和一个简单的帮助系统。与此同时,将讲述基于Object UNIX Class Library的UNIX交互式程序设计的一些主要原理,如消息处理等。

从第二章到第六章将分下述步骤讲述Object UNIX Class Library的编程方法:

l     主窗口类

l     在窗口中显示文本

l     主窗口中的菜单

l     增加对话框

l     帮助系统

如果未改变缺省的安装目录,您将可以在/lfr_ide/sample子目录下找到源代码。文件名分别为:main.cpp、user.cpp等等。

2.1 编制一个Object UNIX Class Library应用程序:预备知识

在开始编制Object UNIX Class Library应用程序之前,必须做好这样几件事情:第一、须规定正确的包含目录以使编译器能找到所有相关的文件;第二、须规定正确的库目录,以使连接器能找到应用程序所需要的库文件。

2.1.1 类库

Object UNIX Class Library依赖于lib子目录中的类库。所有Object UNIX Class Library的对象均以Object作为她们的基类。Object UNIX Class Library还可以用到类库中的其它类如TWindow类或者Tdialog类。读者可以在Object UNIX Class Library程序中随意使用各个类。

2.1.2 目录

除了应用程序可能用到的标准头文件(如stdio.h和curses.h等)之外,还需要告诉各种编译器工具,Object UNIX Class Library的头文件(如owl.hpp)存在何处。在编写Object UNIX Class Library程序时,必须包含owh.hpp文件。

所有的应用程序均须访问运行时间库,另外还有自己建立的库或者从别处购买的库。除此之外,一个Object UNIX Class Library应用程序还需要访问标准的Object UNIX Class Library类库。

下面列出安装程序所使用的缺省目录。如果告知了安装程序使用不同的目录,则需要修改所提供的make文件或者工程文件以适应实际的目录设置,在本系统提供的集成编译环境下,您可以通过选项菜单项来修改目录设置。

在UNIX环境的的目录结构下,Object UNIX Class Library存放在本系统安装后的系统目录下:/lfr_ide。

该目录下有几个子目录:./bin、./doc、./lib、./include。

./lib目录下存放着Object UNIX Class Library的系统类库libowl.a,通过链接本系统于用户的应用程序中,用户的应用程序将具有本系统提供的一系列交互式屏幕特征。

./bin目录下存放着集成编译系统程序以及一些UNIX下使用的工具如:dir、sdir、mdir、psvi等。

./include目录下存放着使用本Object UNIX Class Library类库系统的一些必要的头文件信息。

./doc目录下存放着C/C++集成编译系统以及Object UNIX Class Library的操作使用说明文档。

在用户编译他的应用程序时,请在make文件中指定包含头文件所在的目录:-I/lfr_ide/include以及库所在目录-L/lfr_ide/lib。

您还应该指定make的参数:-lowl。

2.2 建立Object UNIX Class Library应用程序

有两种建立Object UNIX Class Library应用程序的方法,第一种是利用本系统提供的集成编辑编译环境的项目管理程序IDE,第二种方法是使用UNIX系统提供的VI和make文件工具与命令行工具CC。

2.2.1 使用IDE建立Object UNIX Class Library应用程序

使用集成开发环境IDE建立Object UNIX Class Library应用程序时,需要使用工程项目文件。关于使用工程项目文件的详细步骤,请参阅IDE的使用说明。建立Object UNIX Class Library应用程序工程项目文件的一般步骤如下:

l     创建工程文件

指定工程文件名,工程项目文件存放目录,工程执行文件名,选择是否连接Oracle数据库,将应用程序的源文件(带.cpp等扩展名)加到项目文件中。

l     打开工程文件

l     指定包含目录或库目录(参阅上节说明)

2.2.2 使用UNIX系统提供的make或者CC命令行工具

如果使用UNIX系统提供的make或者CC命令行工具编译和连接Object UNIX Class Library应用程序,用编辑配置文件的方式建立make文件来指定包含目录或库目录可能是最简单的方法。在make文件中,可以用-l和-L指示相应的目录.

可以使用类似如下所示的命令行来编译和连接应用程序:

CC Co test main.cpp CI/lfr_ide/include CL/lfr_ide/lib Clowl Cltinfo

该命令行首先编译main.cpp文件,然后再将它与libowl.a相连接。

2.3 第一步:一个简单的基于UNIX系统的交互式应用程序

Object UNIX Class Library应用程序开发可以从编写框架开始。与此相应的范例是/lfr_ide/sample/main.cpp。main.cpp的首要任务是生成应用程序主窗口。

2.3.1 应用程序要求

所有的基于Object UNIX Class Library系统的交互式应用程序都必须有一个主窗口。当程序启动时,主窗口便会出现。用户通过关闭主窗口的退出系统菜单而退出应用程序的。在Object UNIX Class Library应用程序中,主窗口通常是一个窗口对象(WindowsObject)。这个对象是从属于应用程序对象(Application Object)的。应用程序对象生成并显示主窗口,处理用户键盘消息以及终止应用程序的执行。应用程序对象是应用程序的面向对象代理。Object UNIX Class Library以相同的方式提供了窗口、对话框和其它类,这些类隐藏了UNIX应用程序的编程细节。

每个Object UNIX Class Library程序都必须定义一个新的应用程序类,新的应用程序类必须是所提供的Tapplication类的派生类。在main(UNIX程序的入口点)中,构造这个派生类的事例(应用程序对象)。按造惯例,通常类型(类及类的事例)标识以字母T打头。在范例程序中,这个类称为TlfrApp。

此处的是范例程序的主函数:

int main(void)

{

InitScreen();//初始化curses库

TlfrApp LfrApp(“Sample Object UNIX Class Program”);

LfrApp.Run();

FreeScreen();//释放分配的curses库空间

}

在第二个语句中,main构造了范例程序的“应用程序对象”,

字符串“Sample Object UNIX Class Program”给传递给构造函数,进而被赋值给数据成员AppName。它们最终是作为应用程序对象的数据成员存放。然后调用TlfrApp.Run来启动Object UNIX Class Library应用程序的执行。

l     定义应用程序类

应用程序必须从标准的Object UNIX Class Library类Tapplication(或者Tapplication派生的某个类)派生出新的类。这个新类至少应该重定义一个虚拟成员函数InitMainWindow。InitMainWindow在Object UNIX Class Library应用程序初始化期间构造一个主窗口对象。此处是类Tapplication的定义:

class TLfrApplication : public TApplication {

public:

TlfrApplication(char *AppName)();

Virtual void InitMainWindows(void);

};

这个主窗口对象存放在应用程序对象的MainWindow数据成员之中。应用程序对象拥有主窗口对象,但两者在层次上并不相关。这种拥属关系被称为事件链(instance linkage)。TlfrApp::InitMainWindow的定义如下所列:

void TlfrApp::InitMainWindow(void)

{

MainWindow=new TWindow(”Sample Object UNIX Class Program“,

1,0,78,25,WHITE_BLUE,BLUE_BLUE);

}

TlfrApp的主窗口对象是作为TWindow的一个事例而构造的(如上所似)。其中第一个参数是窗口的标题,它是应用程序主窗口对象的Caption的数据成员,已被置为“Sample Object UNIX Class Program”。这样,主窗口对象将作为Object UNIX Class Library的派生类的一个事例。

下面给出第一个范例程序的完整列表:

#include “owl.hpp”

class TLfrApplication : public TApplication {

public:

TlfrApplication(char *AppName)();

Virtual void InitMainWindows(void);

};

int main(void)

{

InitScreen();//初始化curses库

TlfrApp LfrApp(“Sample Object UNIX Class Program”);

LfrApp.Run();

FreeScreen();//释放分配的curses库空间

Return 0;

}

2.4 第二步:主窗口类

第一个程序有两个对象组成:应用程序对象和窗口对象。应用程序对象LfrApp是TlfrApp类的一个实例,它是从类Tapplication派生而来的。保存在MainWindows之中的窗口对象指针指向TWindows的一个实例,这是一个一般性的Object UNIX Class Library窗口。可以按正常方式为主窗口定义自己的窗口类。包括组合进去应用程序特有的操作,此处,通过定义一个特殊的窗口类(从Twindow类派生的)而使主窗口产生活力。

2.4.1 何谓主窗口

在第一个步骤中,读者可以看到应用程序对象封装了基于UNIX文本环境下curses库的交互式应用程序的标准操作,包括构造主窗口。类Tapplication为Object UNIX Class Library的应用程序提供了基本的操作。类似地,窗口对象也封装了窗口的必要操作,包括:

l     窗口自身的显示

l     支持菜单操作

l     事件响应

Object UNIX Class Library窗口类提供了这些操作。

为使程序有趣且有用,必须依据Object UNIX Class Library类生成新的窗口类。新的类不仅可以继承父类的成员函数和数据成员,而且还能增添其自己的成员函数和数据成员。总之,面向对象方法避免了从头构造窗口的必要性。

2.4.2 生成主窗口对象

既然已经有了主窗口对象构成的概念,边可以定义新的主窗口。新的窗口类是有Twindow派生的,将用于构造应用程序的主窗口。首先,说明新类的TlfrWindow:

class TlfrWindow:public Twindow {

public:

TLfrWindow(char *caption,int left,int top,int width,

int height,int ftcolor,int bkcolor) :

TWindow(caption,left,top,width,height,ftcolor,bkcolor){}

};

注意,新的派生类的构造函数不定义新的行为,而只是调用基类(TWindow)的构造函数。

其次,更改TlfrApp::InitMainWindow使其构造一个TlfrWindow对象,而不是Twindow对象。

Void TlfrApp::InitMainWindow(void)

{

MainWindow = new TlfrWindow(”Sample Object UNIX Class

Program“,1,0,78,25,WHITE_BLUE,BLUE_BLUE);

}

说明新类和在InitMainWindow成员函数中对其作初始化是为主窗口的新类需要,应用程序对象调用窗口对象的成员函数生成窗口界面元素并将探们显示在屏幕上。

然而,TLfrWindow除了从TWindow和TObject继承属性之外,并没有定义新的饿属性。换句话说,并没有给应用程序增添新的内容。下一节,将增加某些新的属性。

2.4.3 响应事件

使一个窗口对象生效的最快捷的方法是教它如何响应消息。由于在UNIX环境下的curses很少采用鼠标操作,所以本系统采用对键盘操作事件的捕获来响应用户的击键事件。

在主窗口中,最常用的是对主窗口菜单事件的处理。为了解释和响应菜单选择事件,必须在主窗口类中为每个菜单项定义一个类成员函数,这些成员函数统称为消息响应函数。当用户在选择某个菜单项的时候,通过对消息响应函数的内部判别来执行用户的按键选择事件。

此处的详细说明,请参阅下一章的增加菜单。

2.4.4 终止应用程序

当用户选择主窗口的退出系统菜单项时,程序便被关闭。这包括关闭窗口显示和终止程序执行。这种关闭操作似乎没有什么问题,但对于其它情形,恐怕则不然。

例如,在退出应用程序时是否保存自己的工作?一个好的应用程序在用户工作未被保存时,总要询问用户是否要包寻结果。可以很容易地增加这种属性到Object UNIX Class Library应用程序中。可以在示范程序中增加双重检查用户退出请求的功能。

当用户试图关闭Object UNIX Class Library应用程序时,应用程序的虚拟成员函数CanClose被调用。CanClose是一个BOOL函数,它判断是否关闭应用程序。在缺省情况下,调用主窗口对象的类成员函数CanClose来决定是否能够关闭应用程序的。

主窗口类TlfrWindow从TWindow继承CanClose成员函数调用,如果用户需要修改一个程序的关闭行为,将需要重定义主窗口类的CanClose成员函数。

Int TLfrWindow::CanClose(void)

{

return MsgDialog(“退出系统”, “确认退出系统吗?”);

}

此处,当用户试图关闭示范应用程序时,就会显示一个消息框,询问“确认退出系统吗?”当用户按下回车键,则退出应用程序,按下ESC键,则阻止应用程序的关闭。

上一篇:关于的古诗题目下一篇:城乡居民基本医疗政策