Linux系统的C编程PPT课件

上传人:无*** 文档编号:200432064 上传时间:2023-04-15 格式:PPT 页数:98 大小:160KB
收藏 版权申诉 举报 下载
Linux系统的C编程PPT课件_第1页
第1页 / 共98页
Linux系统的C编程PPT课件_第2页
第2页 / 共98页
Linux系统的C编程PPT课件_第3页
第3页 / 共98页
资源描述:

《Linux系统的C编程PPT课件》由会员分享,可在线阅读,更多相关《Linux系统的C编程PPT课件(98页珍藏版)》请在装配图网上搜索。

1、第十一章 Linux系统的C编程 第十一章 Linux系统的C编程 11.1 编译器 头文件 链接器与库文件 11.4 静态库 11.5 共享库 11.6 make与Makefile 11.7 调试器gdb 11.8 UNIX/Linux其它编程工具简介 11.1 编译器 11.1.1 功能及用法 11.1.2 参数及说明11.1.3 示例11.1.4 gcc的工作过程11.1.1 功能及用法 1.为什么要使用编译器?C语言源程序需要经过编译和链接这两个过程才能转换成二进制可执行程序。一般在Unix系统中使用的C编译器是cc(C Compiler的缩写)。在各个Linux发行版本中广泛使用的C

2、编译器名为gcc(GNU cc)。为了保持与Unix系统的兼容,在Linux系统中cc作为了gcc的一个链接。的功能gcc能将C/C+源程序和目标程序编译并调用链接程序ld生成可执行文件,如果用户没有给出可执行文件的名字,gcc将默认生成一个名为的可执行文件。的用法gcc的一般用法为:gcc options 其常用格式为:gcc-c-S-E-s-g-static-shared-rdynamic-Idir-Ldir-lmylib-Olevel-x Language-Dmacro=defn-Umacro-mmachine-option-o out_file infile 几点说明gcc根据源程序的

3、扩展名来决定使用哪一种语言的编译器进行编译工作。扩展名为“.c”的文件被gcc认为是C语言的源程序文件。例如:gcc gcc编译出来的可执行程序默认是。g+是一个C+版本的gcc编译器。g+要求C+语言源程序文件带有扩展名“.cc”或“.C”。例如:g+,g+参数-c:编译后仅输出*.o型的目标文件,而不连接生成可执行程序-S:编译后仅生成汇编语言文件*.s,但不生成目标文件和可执行代码-s:生成可执行文件时,删除符号表和重定位信息。生成成品软件时使用-E:在预处理过程后结束,不进行编译和连接,也不生成可执行代码-g:在可执行文件中加入调试信息,便于程序的调试参数(续)-o outfile:指

4、定输出文件名。若不指定则生成-Idir:将目录dir添加到头文件搜索范围-lmylib:连接时搜索库-Ldir:将目录dir添加到库文件搜索范围-OL:编译时进行优化。L为优化级别,分别03和s。生成最终产品时使用-static:禁止使用共享库(动态连接库)-shared:生成共享库-rdynamic:连接时使用共享库11.1.3 示例1.C程序 设有一个文件名为的程序,其内容为:#include#includemain()main()printf(“Hello World!n”);printf(“Hello World!n”);编译和执行步骤编译 gcc#生成可执行程序,或gcc o hel

5、lo#生成可执行程序hello运行 ./或 ./hello 输出结果 Hello World!2.c+程序一个c+版的Hello World程序,其文件名为,内容为:#include main(void)cout Hello,World!endl;编译方法使用c+或g+来编译:g+#生成可执行程序c+o hello#生成可执行程序hellog+s-o Hello#生成删除符号表的可执行程序Hello 或使用gcc并指定库文件来编译c+程序:gcc c#生成目标文件gcc o h lstdc+#指定标准c+库,生成可执行程序h11.1.4 gcc的工作过程使用gcc/g+由C源代码文件生成可执行

6、文件的过程,有以下四个阶段预处理(也称预编译,Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking)11.2 头文件 在标准C中有两种形式的头文件使用方式:#include#include“”区别:#include 型头文件搜索范围为默认位置/usr/include,#”型头文件的搜索位置为当前目录,在Linux的GNU C中,若当前目标不存在,则也会到默认位置去搜索。11.3 链接器与库文件UNIX/Linux的链接器为ld,其功能是将目标文件或库文件链接在一起,生成可执行文件,一般在编译过程的最后执行。Linux标准库文件一般存放在目录/l

7、ib或/usr/lib。默认情况下链接器查找C语言的标准库函数。如果使用的不是标准的库函数,必须通过-llib或-Llibdir告诉链接器ld,否则将无法找到库函数。关于库文件的规定库文件命名必须遵守一定命名规则,库文件名字必须永远以lib开头,后紧跟库类名,文件名的后缀为.a:传统静态库.so:共享库或动态链接库例如,为标准C库,为数学运算静态库,和分别为标准C和数学运算共享库。11.4 静态库静态库也叫档案(archive),以.a为后缀,用于编译链接后生成静态可执行文件。用户可以使用库管理程序ar和ranlib来创建和管理自己的或已有的静态库。11.4.1 引例设有C语言文件,它们的内容

8、分别为:/文件的内容f1(int arg)printf(”F1:you passed:%dn”,arg);/文件的内容:f2(char*arg)printf(”F2:you passed:%sn”,arg);/文件的内容#include main()fprintf(stderr,”Begine:n”);f1(15);f2(”Hello World!”);fprintf(stderr,”:Endn”);exit(0);编译与链接可以采用各模块文件分别编译然后再统一链接的办法进行编译。cc c f1.c f2.c/生成和cc o f f3.c f1.o f2.o/生成fcc o fp f3.c f

9、1.c f2.c/生成fpcc c f1.c f2.c f3.c/生成和cc o myp f1.o f2.o f3.o/生成myp11.4.2 构造和管理静态库用户可以使用命令ar构造自己的静态库:cc -c f1.c f2.c#生成目标文件和ar crv f1.o f2.o#生成库ranlib#为子函数建立索引表说明ar用于静态库文件的管理,其功能是库创建、修改和从库中取出模块等 ranlib用于为刚建立的库文件建立索引表,通过索引表可以加快库文件搜索速度。其用法为:ranlib-vV ar_file11.4.3 使用自己的库#使用库和生成可执行程序fp:cc -o fp f3.c#使用库和

10、生成可执行程序fp:cc -o fp f3.o#-L指定当前目录,-lmyl指定静态库文件:cc -o fp f3.c-L.lmyl11.5 共享库Linux系统的另一种库文件为共享库,用于生成动态链接的可执行程序。共享库文件名的格式为:NAME为库名,N为版本号。可用命令ldd和ldconfig命令管理共享库。11.5.1 构造共享库共享库构造非常简单,只需要在构造库的时候使用-shared参数就可以了。例如:用和构造共享库,方法是:#生成目标文件cc-c f1.c f2.c#由目标文件生成共享库cc-shared-o#由源文件生成共享库cc-shared-o 11.5.2 共享库的使用 共

11、享库要使用头文件和几个相关的函数:dlerrordlopendlsymdlclose。1.dlopen功能:用于打开指定共享库,并返回文件描述符。原型及用法:void*dlopen(const char*filename,int flag);返回值:成功时返回文件描述符,否则返回NULL。dlopen函数的相关说明变量filename为共享库名。若文件名不以/开头,则为非绝对路径名,将按以下顺序搜索库文件:(1)环境变量中的LD_LIBRARY_PATH值指定的路径;(2)动态链接缓冲文件/etc/;(3)库文件默认目录/lib,/usr/lib。变量flag用来表示在什么时候解决未定义的符号

12、,其取值范围与意义如下:(1)RTLD_LAZY:指定在动态链接库的函数执行时解决;(2)RTLD_NOW:指定在dlopen返回前就解决所有未定义的符号问题。一旦有未解决好未定义的符号,dlopen将返回NULL表示错误。注意:RTLD_LAZY和RTLD_NOW可以与RTLD_GLOBAL配合使用,使得那些在以后才加载的库可以获得其中的符号。2.dlsym功能:返回共享中指定函数的入口地址原型及用法:void*dlsym(void*handle,char*symbol);说明:dlsym根据共享库文件描述符(handle)与符号(symbol),返回symbol对应的(函数)入口地址,相当

13、于返回一个(函数)指针。3.dlclose功能:关闭已经打开的指定共享库文件,此操作应在共享库相关操作完成之后进行。原型及用法:int dlclose(void*handle);4.dlerror功能:返回动态共享库操作状态信息。当共享库操作函数执行失败时,dlerror可以返回出错信息,否则返回值为NULL表示成功。原型及用法为:const char*dlerror(void);5.共享库使用示例为了使用刚创建的共享库,需要对引例中的模块文件进行修改。假定修改后的文件被命名为,其代码如下:#include#include#define SO_FILE./main()void*sfp;char

14、*err;int tmpi=16;int(*f1)(int),(*f2)(char*);/定义函数指针sfp=dlopen(SO_FILE,RTLD_LAZY);/打开共享库if(sfp=NULL)fprintf(stderr,dlerror();exit(1);f1=dlsym(sfp,f1);/获取函数f1入口地址(指针)err=dlerror();/检查是否成功if(err)fprintf(stderr,err);exit(2);f2=dlsym(sfp,f2);/获取函数f2入口地址err=dlerror();/检查是否成功if(err)fprintf(stderr,err);exit

15、(3);fprintf(stderr,-begine-n);f2(Test String);/调用函数f2f1(tmpi);/调用函数f1fprintf(stderr,+end+n);dlclose(sfp);/关闭共享库exit(0);编译方法编译方法为:cc o myp f3n.c ldl 由共享库生成可执行程序myp,-ldl则指示链接程序ld使用dl函数库。在编译时也可以使用-rdynamic参数,告诉链接程序在链接时所有函数均使用共享库。其方法为:cc rdynamic o myp f3n.c ldl6.共享库的管理(1)ldd(2)ldconfig(1)ldd功能:ldd(Libr

16、ary Dependency Display)用来显示一个可执行程序或共享库所使用的共享库间的依赖关系。例如:ldd mypldd/usr/bin/mesg(2)ldconfig功能:在默认目录(/lib和/usr/lib)或动态库配置文件/etc/内所列的目录下或指定目录下搜索共享库,进而创建出动态装入程序所需的链接和缓存文件。缓存文件默认为/etc/,其中保存有已排好序的由/etc/指定的目录内动态链接库名字列表。为了让系统或用户动态链接库为系统所共享,需要运行ldconfig来对共享库进行配置。ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命

17、令。用法为:ldconfig 选项选项 ldconfig的使用示例1)显示搜索的目录和共享库,并更新缓存文件/etc/ldconfig-v 默认情况下,ldconfig不输出任何东西。使用-v参数可以显示正在扫描的目录及搜索到的共享库。2)安装共享后,更新目录/lib内的符号链接 ldconfig n/lib11.6 make与Makefile 11.6.1 make的用法简介11.6.2 Makefile文件11.6.3 make的用法简介11.6.4 Makefile示例11.6.1 make的用法简介make命令会根据Makefile的内容对项目进行管理。make能自动确定哪一个模块被修

18、改了,然后再进行统一、无遗漏的编译。最后实现项目或软件包的管理工作。make的用法为:make-f filename options targetsmake的常用参数-C dir:在读:在读Makefile或做任何操作前切换目录,或做任何操作前切换目录,一般用于对目录的递归搜索一般用于对目录的递归搜索-d:显示调试信息:显示调试信息-f file:指定:指定file文件作为文件作为Makefile,而非使用默,而非使用默认的认的makefile或或Makefile-I dir:指定:指定Makefile搜索目录搜索目录-k:默认情况下:默认情况下make在遇到错误将终止执行,在遇到错误将终止执

19、行,-k可以让在出现错误时工作的尽量长一些,以便观可以让在出现错误时工作的尽量长一些,以便观察分析察分析-n:让:让make在不真正编译的情况下列出将执行在不真正编译的情况下列出将执行的步骤的步骤11.6.2 Makefile文件Makefile文件的内容是描述项目或软件(包)中的模块之间的相互依赖关系以及目标文件、可执行程序产生时要执行的命令等。Makefile文件可认为是一个工程规划文件。传统Unix使用的是Makefile,现在也可使用makefile(1)Makefile文件包含的5类内容显式规则:显式告诉make如何编译或构造一个目标隐式规则:隐式的通过变量或规则告诉make如何编译

20、或构造一个目标变量定义:在Makefile中可以像shell编程一样定义和使用变量命令:定义完成某任务所使用的shell命令注释:#开始的部分。意义同shell编程规则的定义规则中的项目定义必须从最左边开始,一个规则中的第二行以后的行必须以tab健开始。规则的格式如下:targets:prerequisitescommands或targets:prerequisites;commandscommands(2)Makefile文件中的常用符号$:目标名$*:删除了后缀的目标名$%:当目标是库文件时,目标内的成员名。例如目标)的目标名为,成员名为$:由空格分隔的目标中所有成员$?:目标中的变化成员

21、$:当前目标的第一个相关成员名Makefile文件中的符号“%”%可以理解为统配符。可使用它定义或重定义模式规则。例如:%.o:%.ccc c$定义了一个规则:所有目标文件*.o依赖C语言源程序*.c;且生成方法为cc-c$。Makefile文件中的符号“=”或“:=”符号“=”或“:=”用于修改已经定义的变量或在已定义变量的基础上定义新变量。例如已知:var1=则var2=$(var1:.c=.o)定义var2=而var1+=重定义var1,其值为var1=“:=”与“=”的区别“:=”与“=”是有区别的。当使用“=”时,变量将做递归或扩展“:=”只作简单替换。11.6.3 make的用法简

22、介 Makefile文件内容可包含多个目标,可以通过make obj的方式指定处理的目标,若不指定则默认为第一个。为了方便的使用Makefile文件对整个项目进行编译,可在Makefile文件内设一个代表整个项目的目标,一般为all。Makefile中的常用目标有时为了对项目进行管理还要设置有clean、install和uninstall目标:clean:用于对项目环境进行准备,清除已经生成的目标文件等以便重新编译;install:用于对整个项目的成品进行安装;uninstall:则是用于对安装的项目进行卸载。11.6.4 Makefile示例1.多模块项目编译示例2.多模块项目共享库编译与使

23、用示例1.多模块项目编译示例在引例中有三个模块,它们分别是,和,它们之间的关系如下图项目编译过程分析按照gcc的工作过程,对模块的编译和链接过程可分为:(1)生成目标代码gccgccgcc(2)生成可执行程序gccMakefile内容 f:f1.o f2.o f3.ogcc-o f f1.o f2.o f3.of1.o:f1.cgcc c f1.cf2.o:f2.cgcc c f2.cf3.o:f3.cgcc c f3.cMakefile的使用有了Makefile文件,可以使用make命令对此项目进行编译。编译方法为:make或 make f若要编译单个项目,比方说,可以使用以下方法:增加al

24、l、clean和install目标的Makefileall:f#make all to build ff:f1.o f2.o f3.ogcc-o f f1.o f2.o f3.of1.o:f1.cgcc c f1.cf2.o:f2.cgcc c f2.cf3.o:f3.cgcc c f3.cclean:rm f f?.o#make all and install f to/usr/bin with permission 755install:allinstall m 755/usr/local/bin2.多模块项目共享库编译与使用示例设共享库创建和共享库使用的Makefile文件分别由和来实现

25、。的内容SRC=f1.c f2.c#定义源文件TGT=$(SRC:.c=.o)#定义目标文件all:libmy.so#定义all目标%.o:%.c#定义目标文件生成规则cc-c$#目标文件生成命令libmy.so:$(TGT)#定义共享库生成规则cc-shared-o$(TGT)#共享库生成命令clean:#定义清理目标rm-f$(TGT)#清理目标目标措施的内容all:mydySRC=f3.cTGT=$(SRC:.c=.o)%.o:%.ccc-c$mydy:$(TGT)cc-o$(TGT)-ldlclean:rm-f$(TGT)Makefile的使用生成目标文件可使用命令make all f

26、 必要时可先运行 make clean-f 使用共享库编译可使用命令make all-f 11.7 调试器gdb11.7.1 gdb功能监视或修改程序中变量的值设置断点以使程序在指定的代码行上暂停执行单步执行或程序跟踪11.7.2 gdb 基本命令break:在代码里设置断点run:执行当前被调试的程序bt:反向跟踪,显示程序堆栈quit:退出gdbc:继续break后的执行watch:监视一个变量的值而不管它何时被改变file装入想要调试的可执行文件set:设置变量的值gdb 基本命令(续)kill:终止正在调试的程序shell:在gdb内执行shell命令list:列出产生执行文件的源代码

27、的一部分print:显示变量或表达式的值next:执行一行源代码但不进入函数内部where:显示程序当前的调用栈step:执行一行源代码而且进入函数内部11.7.3 程序调试方法下面以引例为例,介绍Linux系统内程序调试的基本方法。1.编译时使用调试参数-gcc -g -o myp2.启动gdbgdb myp3.查看源文件(gdb)list4.设置断点(gdb)break 6Breakpoint 1*file f3.c,line 65.开始执行(gdb)runBreakpoint 1,main()at f3.c:66f2(Test String);6.打印变量的值(gdb)print tmp

28、i$1=167.单步执行,跟踪进入函数f1(也使用next命令执行f1,而不进入函数f1)(gdb)stepf1(arg=16)at f1.c:33 printf(”F1:you passed%dn”,arg);8.显示f1()变量arg的值(gdb)print arg$2 arg=169.可在任何位置使用where命令,显示程序的调用栈,而得到自己位置。方法是:(gdb)where10.列当前文件的内容(gdb)list11.程序继续执行直到程序结束(gdb)continue11.8 UNIX/Linux其它编程工具简介 11.8.1 常用库与GNOME/GTK开发 11.8.2 KDeve

29、lop/Qt开发11.8.3 Java开发11.8.4 Delphi开发11.8.5 Perl开发11.8.6 数据库开发11.8.7 PHP开发11.8.1 常用库与GNOME/GTK开发1.XLIB2.GLIB3.GDK 4.GTK5.GNOME11.8.2 KDevelop/Qt开发KDevelop是一个基于GPL的集成开发环境(IDE),提供有可以产生Qt图形界面的资源编辑程序。具有编辑、编译、链接、排错、版本管理及计划管理等基本功能。Red Hat Linux 9自带有KDevelop开发集成环境。用户可以通过“开始”“编程”“KDevelop”打开操作界面 11.8.3 Java开

30、发在Linux系统中可有多种方法进行Java开发,常用的有Eclipse集成开发平台和Java SDK开发环境。11.8.4 Delphi开发Kylix是Borland公司正式发布的用于Delphi开发的集成环境,是目前Linux平台上的完整的快速应用程序开发(RAD)工具。Kylix在数据库开发方面几乎支持目前所有的流行数据库,比如Oracle、Infomix、DB2、MySql和PostgreSql等。Kylix是商业软件,用户只有签署许可证协议,并付费后才能使用该软件。11.8.5 Perl开发 Perl是开源的 Perl是一种易学易用语言,具有高级语言的强大功能和灵活性。Perl是一种

31、脚本语言,由解释器perl执行,在Red Hat Linux 9中它是/usr/bin/perl。Perl脚本的执行,需要perl软件包的支持,在Red Hat Linux 9中包名为,用户可在系统安装时安装,也可在系统扩充时安装。11.8.6 数据库开发在Linux系统中可以使用数据库的选择较多,其中mSQL、MySQL和PostgreSQL是三个最流行的、开源的和基于SQL的数据库。11.8.7 PHP开发PHP(Personal Home Page)是一种跨平台的在服务器端执行的脚本语言,可以Windows、UNIX/Linux系统上运行。PHP是免费软件,用户从网站http:/中得到所

32、需的版本。Unix环境下的用户接口设计模式 Unix有几种竞争的接口风格,显得有点乱,但存在即是合理:它们为不同的情形而优化。通过理解任务和接口风格之间的配合,用户将会学习到如何为自己的工作选择正确的风格。1 用户接口设计两个主题在Unix接口设计的传统中,我们会反复涉及两个主题。与其它程序通讯方式的前瞻性设计最小立异原则。借助互助式的组合使用,Unix程序可以发挥更大的威力。接口设计中的“其它程序”部分并不是一个事后追加的考虑或边角情况,相反这是一个核心挑战问题,需要同人类用户的接口需求进行权衡和集成。2 Unix程序获得输入和命令的途径有些Unix程序是图形的,有些拥有面向屏幕的字符接口,

33、而有些使用从机械电传打字机时代遗留的、简单生硬的文本过滤器设计。对于一个没经验的人来说,常常很难看出为什么给定的程序使用某一风格,为什么Unix支持这么多的接口风格。程序标准输入端的数据和命令。IPC的输入,比如X server事件和网络消息。已知位置的文件和设备(比如由程序传递的或计算的数据文件名)。程序能够以完全同样的方式发布结果(输出到标准输出)。3 最小立异原则的应用 最小立异原则:“少来标新立异”,是所有接口设计中的通用原则,且并非仅局限于软件设计。接口设计的标新立异,往往把注意力牵到了接口本身,却忽视了其所属的任务。因此,为了设计可用的接口,最好避免设计一个全新的接口模型。“新颖”

34、会给用户带来学习负担,所以能少则少。相反,应该仔细考虑用户群体的经验和知识,应该尝试去发现那些用户已知程序同自己程序之间的功能相似性。然后效仿己知接口的相关部分。最小立异原则不应被理解为在设计中号召机械的保守主义。新颖性提高了用户与接口最初几次的交互成本,但是糟糕的设计永远使得接口令人痛苦而多余。4 Unix接口设计的历史Unix的出现远在现代倾向图形密集型的软件接口设计之前。在1969年Unix诞生后的十年里,在电传打字机和文本模式哑终端上的命令行接口(CLI)就是标准。1980年后,Unix逐渐支持在字符阵列终端的屏幕绘图。程序开始混合命令行和可视接口。到了1980年代中期,整个计算机世界

35、开始吸收施乐(Xerox)Palo Alto研究中心从1970年代早期就开始研究的图形用户接口(GUI)的开拓性工作结果。1987年左右,X window系统打败了几个早期的竞争者和原型成果,成为Unix的标准图形接口。自1990年代中期,X在最低端的个人Unix机器上已经普遍存在。Unix文本模式终端的使用,快速地消亡并似乎走向绝灭。而Unix古老的CLI设计传统仍然相当有生命力并在许多领域同X卓有成效地竞争着。5 接口设计评估 对一个项目作出设计决定,重要的是应该知道如何挑选一个(或组合多个)适合程序应用和受众群体的接口风格。可用五种标准对接口风格进行分类和评估:简洁:是指一个事务处理需要

36、的动作时间及复杂度有较低的上限(如击键量、鼠标手势量和需要多少秒的注意力等)。简洁接口会以相对较少的比特或状态变化包装更多的作用效果。表现力:是指接口可以触发相当广泛的行为。最具表现力的接口可以启动程序设计者没有预见的行为组合,并仍然给予用户有用和一致的结果。易用:为了使用接口,用户需要特别记忆多少东西(命令,鼠标手势,原语概念)。易用性同要求用户记忆的东西成反比。透明:是指用户在使用时,几乎没有什么(数据、程序的相关状态等)需要记忆。一个高度透明的接口,对于用户动作的效果,能够自然地给出中间结果、有用反馈和错误通知。脚本化能力:脚本能力,是指接口能够容易地为其它程序所使用。可脚本化的程序通常

37、被其它程序作为组件使用。6 CLI和可视接口之间的权衡 早期Unix的CLI风格,其效用仍得以保留,原因有2:比GUI更具表现力,尤其是针对复杂的任务。脚本化能力强;通常(但并不总是)CLI在简洁性上也占据优势。当然了,CLI风格的劣势在于,几乎总是需要费劲地记忆(易用性低),并且透明度通常也很低。多数人(尤其是非技术型最终用户)认为这种接口相对神秘、难以学习。随着用户变得越来越熟练,对CLI接口的抵触也越来越少。在许多问题定义域上,用户(特别是常用的用户)往往会达到一个交叉点,CLI的简要性和表达力变得要比避免记忆负担更有价值。这样,计算机初学者倾向于易用的GUI桌面,而老手常常逐渐发现他们

38、更愿意在shell中键入命令。7 透明、表现力和可配置 Unix程序员继承了一个强烈的偏爱,愿意使接口富有表现力和可配置。并且更愿意牺牲易用性来换取这些品质。关于为非技术型终端用户设计接口是一个要求颇高的艺术,而Unix程序员通常不擅长于这方面的传统。但是拥有从Unix传统讨论中已经揭示出来的思想,可以给出一个强力而有用的表述:当人们说一个用户接口是直观的,他们的意思是(a)它是可显的,(b)用法是透明的,(c)遵循最小立异原则。在这三条原则中,最小立异原则是最弱的约束。8 Unix接口设计模式 在Unix传统中,已经形成了良好的接口设计模式,可以完成以上讨论的权衡。过滤器模式;Cantrip

39、模式;源模式;接收器模式;编译器模式;ed模式;Roguelike模式。1)过滤器模式 与Unix相关的最经典的接口设计模式非过滤器莫属。“过滤器”确实历史悠久,在管道出现的时候就有了。过滤器程序接受标准输入的数据,转换成某种格式后,再将结果发送到标准输出端。过滤器不是交互的;也许会查询启动环境,并且通常由由命令行选项控制,但并不要求用户在输入流中输入命令或给出反馈。过滤器两个经典的例子是tr和grep。当定义过滤器时,最好在心中牢记一些附带的原则:1.牢记Postol原则:宽进严出。2.在过滤时,不需要的信息也决不丢弃。3.在过滤时,绝不增加无用数据。2)Cantrip模式 Cantrip接

40、口设计模式是其中最简单的。没有输入,没有输出,只被调用一次,产生退出状态数值。一个cantrip程序的行为只能由启动条件来控制。没有任何程序会比这种方式更具备脚本能力。经典例子是clear、rm、touch和startx3)源模式“源”是一种类似过滤器的程序,不需要输入;它的输出只能在启动条件中控制。例证程序是ls,who和ps等。4)接收器模式 接收器是一种类似过滤器的程序,只接纳标准输入而不发送任何东西到标准输出。同样,它对输入端数据的作用行为只能在启动条件中控制。常见示例有:lpr和mail等。5)编译器模式 一个类似编译器的程序从命令行接受文件或资源名,以某种方式转换这些资源,然后再以

41、改变后的名字输出。类似编译器的程序既无标准输出也无标准输入;然而它们会将错误信息发送到标准错误端。实例程序有:cc,gif2png,gzip和gunzip等。6)ed模式 ed是Unix系统中最简单的交互设计模式的行编辑器。ed程序需要一个文件名作为参数;然后可以修改该文件。在输入端,它接受命令行。一些命令的结果输出到标准输出端,作为与程序对话的一个部分,可以立即为用户所见。在Unix传统中,最简单的交互设计模式以Unix的行编辑器ed程序作为代表,其他这种模式的例子包括ftp、sh和gdb等。ed是Unix其它编辑器,比如vi、sed等,的基础。7)Roguelike模式 Roguelike

42、模式的名字来自这种模式的第一个例子:BSD下的地牢探险游戏rogue,以后类似的程序就称为是Roguelike的。Roguelike程序是设计来运行在系统控制台、X终端模拟器或视频显示终端上的游戏,使用全屏幕、支持可视界面风格,但使用字符阵列显示,而非图形和鼠标界面。Roguelike模式的程序难以脚本化,实际上,甚至连这个意图都很少有。在可视性方面,这种模式远没有鼠标驱动的完整GUI那般流畅。最后(可能也是最重要的),roguelike模式常常更吸引重视命令集简要性和表现力的人群,他们能够容忍记忆负担的增加。实例程序很多:vi,emacs,xchat,elm,pine等。应用Unix的接口设

43、计模式我们己经看到了在各种不同情况下针对不同价值特征进行优化的各种接口设计。但是,在适合初学者和非技术型终端用户的GUI及其设计模式,以及服务于专家用户和最大化脚本能力设计之间,存在一个强烈的与生俱来的冲突。摆脱这种两难境地的方法之一就是让程序能够以不止一种方式运行(多价程序模式)。一个多价程序(多角色程序)有以下特征:1.程序的应用定义域逻辑封存在一个文档化的API库中,该库可被其它程序链接。或者有几个不同风格的UI层,每一个层都可以链接该库。2.cantrip。3.GUI。4.脚本接口5.额外可选的UI:curses的roguelike式接口。9“引擎和接口分离”模式 在Unix世界中,这

44、种策略的应用方式通常是:将程序的“引擎”部分(程序定义域的核心算法和逻辑规格)从“接口”部分(接受用户命令、显示结果、或者提供交互帮助和命令历史记录)分离。实际上,这种引擎接口分离模式可能是Unix最具特色的接口设计模式。在施乐PARC图形用户接口的早期研究中,就提出了将“模型视图控制器”模式作为GUI原型的建议。“模型”在Unix世界里通常称为“引擎”。包含了应用程序专用定义域的数据结构和逻辑。“视图”部分将定义域的对象渲染成可视形式。在一个真正分离得当的模型/视图/控制器应用程序中,视图组件由模型通知更新,并且自身作出相应反应,而不是由控制器或被显式更新请求来同步驱动。“控制器”处理用户的

45、请求并将它们作为命令传递给模型。在Unix下,模型/视图/控制器模式比起其它领域都更为普遍,这恰恰是因为Unix中存在“只做一件事并做好”的牢固传统,同时IPC方法既灵活又易于实现。1、配置者/执行者组合2、假脱机/守护进程组合3、驱动/引擎组合4、客户端/服务器组合5、浏览器/服务器组合10 沉默是金如果程序没有什么有趣的或惊奇的东西要说就应该闭嘴(沉默是金):理由一:喋喋不休的程序往往不能跟其它的程序很好地合作。理由二:用户屏幕的纵向空间是宝贵的。程序每产生一行垃圾,用户可见的信息就少了一行。理由三:垃圾信息是对用户带宽的无谓消耗。在屏幕上,这又增加了一个分心的来源,往往让人们不得不在处理

46、更重要的前台工作的同时耗费心力。如果为了调试,需要喋喋不休的进展消息,添加默认情况下禁用的选项。在发布产品时,去除这些信息或用特殊的选项来控制这些信息。GUI的例子长时间的操作要提供进度条。这是个好传统帮助用户有效地分时利用他的大脑,暗示在等待完成的过程中可以离开去阅读邮件或是干点儿别的。不要杂乱地让GUI界面弹出确认消息除非必要的警示而且进一步,父窗口最小化时应隐藏这些信息,又如果焦点不在父窗口时,应避免这些信息。界面设计师的工作是方便用户,而不是在用户面前碍眼。这个原则对于确认提示有着更强的力量。不断询问的答案几乎都为“是”的请求确认会造成用户根本不假思索就点击“是”,这个习惯会带来非常不幸的结果。程序应该只在有足够理由怀疑答案可能是“不”的时候请求确认。并非意外却要求确认是糟糕设计的显著标志。任何确认提示本质上也许就是接口实际上需要一个撤销命令的标志。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!