02_Unix编程培训讲义.doc_第1页
02_Unix编程培训讲义.doc_第2页
02_Unix编程培训讲义.doc_第3页
02_Unix编程培训讲义.doc_第4页
02_Unix编程培训讲义.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Unix编程培训讲义陆云海1999.04.19 初稿1999.11.26 第二版2000.03.23 第三版1. 开发环境以较为流行的Unix操作系统为例,介绍Unix下开发编程的主要内容。SUN工作站与服务器的操作系统是Solaris,常见版本是Solaris 2.5、2.5.1、2.6,较新的是Solaris 7 (相当于2.7版吧),最新的是Solaris 8。Solaris的前身是SunOS,Solaris 2.5相当于SunOS 5.5。SunOS是基于BSD Unix的,而Solaris是基于Unix SVR4的。HP工作站与服务器的操作系统是HP-UX,常见的是HP-UX 10.10、10.20,较新的是HP-UX 11.0。DEC服务器(现在该称为Compaq的AlphaServer)的操作系统是Digital Unix,常见的Digital Unix 4.0D(也叫OSF1),Compaq收购DEC后将Digital Unix更名为TruUnix 64。2. 编译系统 C/C+由于历史的原因,Unix系统的开发主要是使用C/C+语言。C语言的编译器是cc,这是每个系统都会自带的,在/usr/ccs目录下。对于有些需要使用标准C语言的场合,需要安装ANSI C。C+语言是对C语言的扩充,每家Unix系统的支持就不一样了。SUN机上的C+是SUN Visual Workshop的一部分,需要安装workshop后才能使用C+,也可以只安装C+。安装workshop需要license。SUN上的C+编译器是CC,一般安装在/opt/SUNWspro/bin目录。HP机上的C+是HP开发工具包SoftBench的一部分。SoftBench的安装需要license。HP机上的C+编译器是CC,一般安装在/opt/CC/bin目录。DEC机上的C+是操作系统内置的,编译器是cxx,在/usr/bin目录。2.1 编译过程主要分为编译和链接两大步。具体过程:编译预处理编译优化汇编链接。编译预处理宏定义替换、条件编译、头文件包含、特殊符号(_FILE_、_LINE_等)。编译常数、关键字、标识符、操作符。词法分析、语法分析。优化中间代码优化、目标代码的生成。汇编可重定位文件.o、共享的目标文件.so(.sl)、可执行文件。链接静态链接、动态链接。2.2 cc命令以SVR4上的C编译系统为基础,介绍cc的用法。2.2.1 cc基本用法cc 选项 源文件 .o文件 库文件如果源文件中含有main函数,则生成执行文件,缺省情况为在当前目录产生a.out。否则,则只生成.o文件。2.2.2 常用选项-o 目标文件名:生成指定的目标文件名,可以是执行文件或.o文件,要看有没有-c选项;-c :只生成.o文件;-P:只进行预处理;-C:保留注释;-S:只生成汇编代码;-D符号=值:定义符号,若未指明值,则缺省值为1,可以有多个;-Iinclude目录:定义include文件的目录,可以有多个;-L库目录:定义库文件的目录,可以有多个;-l库名:链接时包含库 lib库名.a或lib库名.so;-g:加入调试信息;-On:进行代码优化,有的系统还带有优化级别。2.3 链接处理链接有静态链接和动态链接两种。2.3.1缺省设置标准的C函数库 libc.a(静态库)、libc.so(动态库)主要包含了以下函数:标准I/O函数(stdio.h):标准输入输出、文件输入输出等;字符串处理函数(string.h):strlen、strcpy等;字符分类(ctype.h):isalpha、isupper等;字符串/整数转换(stdlib.h):atoi、itoa等;库函数形式实现的系统调用(unistd.h,sys/types.h,sys/stat.h,fcntl.h):open、read等。2.3.2标准库-l选项 指定库名,缺省情况下系统自动包含选项-lc,即自动包含标准C库。如果统一库目录下有库的两个版本,则优先使用动态库。缺省的路径:/usr/ccs/lib、/usr/lib动态库:所有内容被映射到进程虚地址空间中。执行文件小,内存占用小。但是运行时必需存在连接的库。静态库:执行文件只包含所需要的代码。执行文件大,内存占用大。但是运行时不需要连接的库。-dn选项(SUN),指明只进行静态连接。-l 选项放在最后较好。2.3.3 静态库、动态库的建立 静态库,又程档案库,建立步骤:1) 生成目标文件 cc -c2) 用ar命令入档ar r $HOME/lib/libtest.a myfunc.o(生成的静态库名前一定要加lib前缀,但使用时不要该前缀,且不要后缀)以后就可以使用test库了cc -L $HOME/lib -o . -ltest静态库的缺点:a. 执行文件大,有函数代码的单独拷贝b. 运行时每个进程都装入某些相同函数的代码,内存占用大c. 函数定义更新后,要重新连接 动态库的生成(SUN) 1、编译cc -KPIC -c myfunc.c2、生成动态库cc -G -o $HOME/lib/libtest.so myfunc.o3、连接cc -o myprog -L$HOME/lib -ltest(HP) 1、编译cc +Z -c myfunc.c2、生成动态库cc -b -o $HOME/lib/libtest.sl myfunc.o或ld -b -o foo.sl foo.oHP-UX 使用 .sl 做共享库扩展,和其它大部分系统不同3、连接cc -o myprog -L$HOME/lib -ltest2.3.4 连接程序搜索目录 -L 选项指定(SUN) -B static|dynamic 指明进行静态或动态连接。环境变量 LD_LIBRARY_PATH可以包括两部分,用分号隔开。搜索顺序:LD_LIBRARY_PATH中;的前半部-L指定的目录LD_LIBRARY_PATH中;的后半部标准位置2.3.5 动态连接程序搜索目录连接阶段搜索方法同2.3.4。运行阶段使用环境变量LD_RUN_PATH指明自定义的动态库的位置。标准位置只有/usr/lib。运行阶段的搜索也可以使用LD_LIBRARY_PATH环境变量,而且效果更好,因为即使动态库被移到另一个目录,也可以被找到。尽量不要使用硬编码(连接时指定库文件名的全路径名),因为这样的话,当动态库所在目录被移动后,运行不会成功。对于静态库无此问题(想想看,为什么?)。2.4 预定义的符号_ _sun_ _unix_ _sparc_ _i386_ _SVR4_ _hp9000s700_ _hp9000s800_ _hppa_ _hpux_ _PA_RISC1_1_ HPUX_SOURCE_ _PPC (Power PC)3. 调试3.1 简介SUN机和DEC机上的符号调试器是dbx,图形界面的是debugger。HP机上的符号调试器xdb。一般的Unix系统都支持汇编级的调试器adb。命令组: 流程控制:断点、单步、连续 变量检查:显示、修改变量的值 函数调用栈的显示 汇编语言级的调试 源程序的显示编译和连接时加上-g选项。运行时应去掉此选项,尤其是在HP机上,否则占用太多的空间。使用strip命令也可以去除执行文件中的调试信息。哪些情况下需要调试: core dumpdbx a.out core 边运行、边调试dbx a.out 活动进程执行很慢时dbx 进程名 进程号 软中断3.2 dbx的常用命令执行和跟踪stop设置断点clear清除断点run启动运行rerun重新运行runargs设置运行参数cont继续运行next执行下一条语句,不进入函数内部step单步执行,可以进入函数内部显示和名字display显示变量的值(一直显示)down到函数调用堆栈的下一级up到函数调用堆栈的上一级where当前在函数调用堆栈的哪一级,程序中断处的源文件名和行数print显示变量的值(只显示一次)访问源文件cd改变目录pwd当前目录edit编辑文件file改变当前源文件files列出所有的源文件的名称func列出当前函数名funcs列出所有的函数名line改变当前行list显示几行源程序search在文件中搜索字符串use设置目标搜索路径运行时检查check -access | -leaks | -memuse | -alluncheckshowleaksshowmemusesuppressunsuppress杂项commands列出dbx的命令和简要解释help求助命令,后可跟希望得到解释的命令dalias显示别名dbxbugreport创建dbx的bug报告模板dbxenv显示或修改dbx的环境debug显示或改变要被调试的程序history显示历史命令kill -l 显示所有已知的信号的标识、名字和描述kill杀掉控制的进程quit退出dbxsetenv设置环境变量sh调用sh执行命令source执行指定的文件中的命令!执行历史命令!执行上条命令debuggertoolenv cwd | font | width | srclines | cmdlines .3.3 xdb的常用命令命令行: xdb -d dir -P process_ID objectfile corefile-d指定源程序所在目录-P指定正在运行的进程的IDobjectfile执行文件corefilecore文件窗口模式命令ts切换分屏模式(源程序窗口、汇编窗口)w size设置源程序窗口的行数(最多为主窗口行数减3)u刷新屏幕U清除并重画屏幕路径映射命令D 目录名定义源程序所在目录,目录名要用引号括起来文件查看命令v显示下一屏程序v 行号显示指定行号的程序,放在窗口中央v 文件名:行号显示指定文件,放在窗口中央L显示文件名、进程名、行号、当前行程序+ 行数向前移动指定行数(缺省为1行)- 行数向后移动指定行数(缺省为1行)/ 字符串向前搜索字符串(缺省为上次搜索的字符串)? 字符串向后搜索字符串(缺省为上次搜索的字符串)n重复上一次的/或?命令N与n命令类似,但是方向相反显示格式countformcharsizecount数目formchar格式符(对于数字,小写表示整数,大写表示长数据)size单元大小格式符n一般格式(normal)(d|D)十进制数(decimal)(u|U)无符号十进制数(o|O)八进制数(octal)(x|X)十六进制数(hexadecimal)(z|Z)二进制数(binary)(b|B)以十进制显示一个字节c显示一个字符C显示一个宽字符(e|E)以指数浮点格式显示(f|F)以一般浮点格式显示(g|G)以g型浮点格式显示a显示以表达式作为首地址的字符串r显示一个对象的模板R显示一个对象的模板,基类也被显示s显示以表达式作为首字节的指针的地址的字符串t显示表达式(通常是变量名或过程名)的类型T与t相同,但对于C+的类和结构对象,也显示基类和结构类型信息p显示包含表达式指定的地址的过程名S结构或类对象的格式化输出k与S相同K与S相同,除了对于C+也显示基类信息size的等价符号b1字节(char)s2字节(short)l4字节(long)D8字节(double)L16字节(long double)数据显示和修改命令p expr相当于p exprnp exprformat以format格式显示expr的内容p expr?format以format格式显示expr的地址p - format显示后一单元的数据p + format显示前一单元的数据p class:显示类的静态成员的值l proc:depthl class:proc:depth列出当前过程(函数)的所有参数和局部变量la列出所有断言lb列出所有断点ld列出所有目录lsl列出所有共享库lz列出所有信号lf string列出所有的或匹配的源文件名lg string列出所有的或匹配的全局变量ll string library列出所有的或匹配的标号lm string列出所有的或匹配的宏lp class:string列出所有的或匹配的函数名ls string列出所有的或匹配的特殊变量lx列出异常 stop-on-throw and -catch 状态 (C+).lcl string列出所有的或匹配的类(C+).lct string列出所有的或匹配的类模板(C+).ltf string列出所有的或匹配的模板函数(C+).lft string列出所有的或匹配的函数模板(C+).lo class:string列出所有的或匹配的重载函数(C+).堆栈查看命令t depth显示指定深度(缺省为20)的函数调用堆栈T depth与t相同,但是也显示局部变量up offset上移down offset下移top移到堆栈顶部(与V 0相同)任务控制命令r arguments运行新的子进程,可以带参数R运行新的子进程,不带参数k中止当前子进程的运行c location继续运行,忽略信号C location与c相同,但是允许接收信号s count单步执行指定条数的语句(缺省为1条)S count与s类似,但是把函数调用看成一条语句,不进去断点命令lb列出所有断点b location count commands设置断点db number删除断点(指定的序号,或者是当前断点)db *删除所有断点bi c count commands当expr是一个类实例时,在实例类的函数proc的可执行首行设置实例断点.bi -c|-C expr commands当expr是一个类实例时,在实例类的所有成员函数的可执行首行设置实例断点。-c表示只针对派生类的成员函数。-C 表示针对基类和派生类的成员函数。bpc -c|-C class commands在类的所有成员函数的可执行首行设置类断点。bpo class:proc commands在所有重载函数proc的可执行首行设置重载断点。bp commands在每个可调试函数的开始处(可执行首行) 设置永久断点。bpx commands在每个可调试函数的结束处(可执行末行) 设置永久断点。bpt commands在每个可调试函数的开始和结束处(可执行首行、末行) 设置永久断点。commands被分配给开始处的断点,缺省为Q;t 2;cdp删除所有函数断点Dpx删除所有函数退出断点Dpt删除所有函数跟踪断点abc commands定义全局的断点命令列表,遇到任何一个断点都会被执行(普通的、实例的、类的、重载的、函数的、函数退出的、函数跟踪的)dbc删除全局断点命令bb depth count commands在指定堆栈深度的函数的开始处设置断点。bx depth count commands在指定堆栈深度的函数的结束处设置断点。bt depth | proc count commands跟踪当前函数。commands缺省为Q;t 2;c ,可以显示堆栈顶部的两个函数,并继续运行。sb num暂停指定序号的断点sb *暂停所有断点ab num激活指定序号的断点ab *激活所有断点tb在暂停和激活之间切换所有断点的模式辅助断点命令if expr commands commands如果expr为非0值,执行第一组命令,否则执行第二组命令Q如果Quiet命令出现在断点命令列表开始处,一般的断点通告breakpoint at address就没有了。任意字符串 打印给定的字符串断言控制命令a commands创建一个新的断言aa number激活指定序号的断言aa *激活所有断言da number删除指定序号的断言da *删除所有断言sa number暂停指定序号的断言sa *暂停所有断言ta在暂停和激活之间切换所有断言的模式信号控制命令z signal i r s Q 切换指定信号的标志(ignore、report、stop)(Quietly)lz列出所有信号的当前触发器宏定义命令def name replacement-text定义宏。undef name取消宏。tm切换宏替换机制的状态(激活、暂停)其它命令回车 或 重复上条命令! command-line执行shell程序f printf-style-format 设置printf形式的地址显示方式,缺省为%10.8lxg (line|#label|+lines|-lines)到栈顶函数的某一行h topichelp topic用more显示有关topic的命令或语法。h help将列出所有topic。I显示有关调试器和标志项的信息q退出调试器tc切换搜索字符串时是否区分大小写的标志4. 程序维护make依赖关系 操作命令 变量(宏) 缺省规则 与sh程序的结合make的工作机制:make描述文件,依赖关系,规则make变量make后缀规则静态库的维护4.1 make工作机制目的文件 依赖文件(行首是tab键,不能是空格)命令检查依赖性是根据文件的最后一次修改时间来判断。缺省的make描述文件是makefile或Makefile。规则形式:1) 目的文件名列表: 依赖文件名列表; shell命令2) 目的文件名列表: 依赖文件名列表t 命令1t 命令2注意!第二种形式必需以制表符开头。文件名列表有多个文件时,中间用空格隔开。一行写不下时,在最后加上可以连接下一行。注释符#可以在任意位置。tab键和命令的第一个字母间插入以下特殊字符:- :忽略命令的返回值,继续下一分支的处理 (等同于make -k) :不显示命令行(等同于make -s)? :不进行命令依赖性检查! :强制进行命令依赖性检查单冒号与双冒号的区别:一个目标出现在多个依赖关系行中时,要么都用单冒号(:),要么都用双冒号(:)。单冒号(:):目的文件的依赖文件列表由多个依赖关系行中的所有依赖文件组成。双冒号(:):对依赖关系行依次检查:如果有一行中的目的文件过时,则执行相应命令,在下一行发现目的文件也过时时,则再次执行相应命令。适合于静态库的维护。4.2 make变量4.2.1 用户自定义变量一般在描述文件前面定义。OBJECTS=p1.o p2.o若变量名不止一个字符,则在引用时要加圆括号。例:$S,$(OBJECTS)也可以在make命令行定义。make NAME=VALUE4.2.2 make预定义变量包括两类:缺省变量、动态变量缺省变量: CCCccCFLAGSCPPFLAGSCOMPILE.c$(CC) $(CFLAGS) $(CPPFLAGS) -cLINK.c$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)C+CCCCCCCFLAGS$(CFLAGS)COMPILE.cc$(CCC) $(CCFLAGS) $(CPPFLAGS) -cLINK.cc$(CCC) $(CCFLAGS) $(CPPFLAGS) $(LDFLAGS)COMPILE.C$(CCC) $(CCFLAGS) $(CPPFLAGS) -cLINK.C$(CCC) $(CCFLAGS) $(CPPFLAGS) $(LDFLAGS)链接LDldLDFLAGSrmRMrm -f后缀SUFFIXES.o.c .c .cc .cc.y .y .l .l .s.s .sh.sh .S.S .ln.h .h .f .f .F.F .mod .mod .sym .def .def.p .p .r .r .cps .cps.C .C .Y .Y .L.L .f90.f90 .ftn .ftn 动态变量:$当前目的文件名称(在命令行中使用)$(D)目录部分$(F)文件名部分$当前目的文件名称(在依赖关系行中使用)$?比当前目的文件更新的那些依赖文件对于引用了此变量的命令行不再进行命令依赖性检查$*去掉后缀的当前目的文件名,只在隐含规则中有意义$(*D)目录部分$(*F)文件名部分$当前目的文件的依赖文件,只在隐含规则中有意义$(D)目录部分$(F)文件名部分$%静态库成员4.2.3 make变量与shell环境变量的交互作用次序:1) 读入环境变量MAKEFLAGS,作为make的命令行2) 内部宏定义3) 环境变量4) makefile中的赋值如果命令行加-e选项,则3)、4)对调。4.2.4 变量的条件赋值类似于 ? :形式:Targets := Macro + = Value例:debug release : myprogdebug := CFLAGS = -grelease := CFLAGS = -O4.2.5 变量值的替换形式:$(Macro:String1=String2如:OBJECTS=p1.o p2.o$(OBJECTS:.o=.c)相当于p1.c p2.c在静态库维护中较有用。4.3 make的后缀规则4.3.1 后缀规则是隐含规则的一种。形式:DsTs:t命令1.t命令nTs是TargetSuffix,代表目的文件后缀。Ds是DependenceSuffix,代表依赖文件后缀。先找普通规则,若未找到,则根据后缀名找后缀规则。特例:不指定目的文件后缀:Ds:t命令1.t命令n此种形式的规则描述了如何根据指定后缀(Ds)的依赖文件生成一个没有后缀的目的文件。例如,make自己了一个.c后缀规则为:.c:$(LINK.c) -o $ $ $(LDLIBS)4.3.2 可识别后缀名表SunOS:SUFFIXES:.o .c .c .cc .cc .C .C .表示是在SCCS的管理之下。添加自己的后缀名到后缀名列表中:加到后面:.SUFFIX: .x加到前面.SUFFIX:#清空.SUFFIX: .x $(SUFFIXES) #利用SUFFIXES变量重置4.4.3 make的标准后缀规则_ C .c$(LINK.c) -o $ $(LDLIBS) _ Files .c.ln$(LINT.c) $(OUTPUT_OPTION) -i $ _ .c.o$(COMPILE.c) $(OUTPUT_OPTION) $ _ .c.a$(COMPILE.c) -o$% $(AR) $(ARFLAGS) $ $%$(RM) $% _ .c$(GET) $(GFLAGS) -p $ $*.c$(CC) $(CFLAGS)$(LDFLAGS) -o $ $*.c _ .c.o$(GET) $(GFLAGS) -p $ $*.c$(CC) $(CFLAGS)-c $*.c _ .c.ln$(GET) $(GFLAGS) -p $ $*.c$(LINT.c) $(OUTPUT_OPTION) -c $*.c _ .c.a$(GET) $(GFLAGS) -p $ $*.c$(COMPILE.c) -o$% $*.c$(AR) $(ARFLAGS) $ $%$(RM) $% _ C+ .cc$(LINK.cc) -o $ $ $(LDLIBS) _ Files .cc.o$(COMPILE.cc) $(OUTPUT_OPTION) $ _ .cc.a$(COMPILE.cc) -o $% $(AR) $(ARFLAGS) $ $%$(RM) $% _ .cc$(GET) $(GFLAGS) -p $ $*.cc$(LINK.cc) -o $ $*.cc $(LDLIBS) _ .cc.o$(COMPILE.cc) $(OUTPUT_OPTION) $ _ .cc.o$(GET) $(GFLAGS) -p $ $*.cc$(COMPILE.cc) $(OUTPUT_OPTION) $*.cc _ .cc.a$(COMPILE.cc) -o $% $(AR) $(ARFLAGS) $ $%$(RM) $% _ .cc.a$(GET) $(GFLAGS) -p $ $*.cc$(COMPILE.cc) -o $% $*.cc$(AR) $(ARFLAGS) $ $%$(RM) $% _ .C$(LINK.C) -o $ $(LDLIBS) _ .C$(GET) $(GFLAGS) -p $ $*.C$(LINK.C) -o $*.C $(LDLIBS) _ .C.o$(COMPILE.C) $(OUTPUT_OPTION) $ _ .C.o$(GET) $(GFLAGS) -p $ $*.C$(COMPILE.C) $(OUTPUT_OPTION) $*.C _ .C.a$(COMPILE.C) -o$% $(AR) $(ARFLAGS) $ $%$(RM) $% _ .C.a$(GET) $(GFLAGS) -p $ $*.C$(COMPILE.C) -o$% $*.C$(AR) $(ARFLAGS) $ $%$(RM) $%_ SCCS .SCCS_GETsccs $(SCCSFLAGS) get $(SCCSGETFLAGS) $ -G$ Files .SCCS_GET_POSIXsccs $(SCCSFLAGS) get $(SCCSGETFLAGS) $ .GET_POSIX$(GET) $(GFLAGS) s.$ _ Shell .shcat $ Scriptschmod +x $ .sh$(GET) $(GFLAGS) -p $ $*.shcp $*.sh $chmod a+x $_4.3.4 静态库的维护libtest(myfunc.o)用来标识库的成员例:$(LIB):$(LIB)(a.o)$(cc) -c $(CFLAGS) a.c$(AR) $(ARFLAGS) $(LIB) a.o$(RM) a.o$(LIB):$(LIB)(b.o)$(cc) -c $(CFLAGS) b.c$(AR) $(ARFLAGS) $(LIB) b.o$(RM) b.o利用动态变量和变量的值替换技术,简化之:$(LIB):$(LIB)(a.o) $(LIB)(b.o)$(cc) -c $(CFLAGS) $(?:.o=.c)$(AR) $(ARFLAGS) $(LIB) $?$(RM) $?使用规则.c.a:$(LIB):$(LIB)(a.o) $(LIB)(b.o)echo $(LIB) is up to date!步骤:$(LIB)(a.o) = $(LIB) : a.o = 查找a.o的依赖文件,未找到,使用内部规则= .a : .o = .X.a,源文件$*.X存在,X在SUFFIXES中 =.c.amake的命令行make -f Makefile Macro=Value .5. 源程序版本维护SCCS5.1 概述与每个源程序对应有一个历史文件,记录了源文件的内容、描述文字、有权添加和删除版本的用户清单和组清单、版本信息(源文件类型、ID关键字、创建日期时间、注释)等信息。每个历史文件有一个SID(SCCS Identifier),缺省初始值为1.1。SID的完整形式:发行号(Release).级号(Level).分支号(Branch).序号(Sequence)创建了初始历史文件,源文件可以被删除。以后需要此源文件时,可以借助于SCCS系统从其历史文件中取出。提取方式有两种:一种是“只读的”,主要用于取出来编译。一种是为版本的升级作准备的,取出来的文件是可读可写的。此时SCCS将为新版本分配新的SID。加入新版本时,SCCS会逐行比较,记录变化的部分。用delta描述对一个在SCCS控制下的文件所做的一组改动。SID实际上是为标识和跟踪一个delta而分配的。SCCS系统不是一个“仓库”,最好将“成品”放进去,而不是“半成品”。如果把某个版本的未最终完成的源文件放到SCCS历史文件中是一种极其不明智的做法,会把历史文件搞得很乱。可以将相邻delta合并,或删除无用的delta。SCCS提供了ID关键字替换机制。SCCS系统将能够识别这些符号,当用户以只读方式提取文件时,SCCS会将这些特殊符号用适当的值替换,由此在源文件中可以记录文件的创建日期、版本号、模块名等有用信息。如果使用得当,这些信息可以出现在最后的可装入模块中,通过某种工具可以检索出来。SCCS同make具有密切关系。在make中有一些与SCCS相关的标准规则。5.2 历史文件的生成与管理(admin)5.2.1 历史文件的生成$ admin -i myprog.c s.myprog.c如果不指定-i,则从标准输入读取源文件:$ admin s.myproc.c myprog.c两者效果一样。生成的历史文件s.myprog.c包括六部分内容: 校验和 delta表记录历史文件中每个delta的类型、SID、创建日期时间和注释等信息 用户名表为空表示任何用户有权操作 标志控制SCCS某些命令的行为方式 描述文本同注释不同,是针对整个源文件的说明 主体SCCS管理的源文件各版本的内容5.2.2 历史文件的管理1. 初始delta号(-i -r)与-i一起使用,设定第一个版本的SID号。$ admin -i myprog.c -r 2 s.myprog.c将第一个版本的delta号设为2.1,而不是缺省的1.1。2. 注释和描述文本(-i -y | -t )-y指定注释,与-i一起使用。$ admin -y This is the first version -i myprog.c s.myprog.c不带-y选项的缺省注释是 date and time created YY/MM/DD HH:MM:SS by USERNAME-t指定包含描述文字的文件名,在创建时给出或以后修改。$ admin -i myprog.c -t desc.txt s.myprog.c或$ admin -t AnotherDesc.txt s.myprog.c如果-t后没有给出描述文件名,则会清除历史文件中的描述文字。3. 用户列表(-a | -e)$ admin -a user1 -a user2 -a 100 s.myprog.c将用户user1、user2、组号为100的用户组添加到用户清单中。$ admin -e user1 s.myprog.c将user1从用户清单中删除。4. 标志( -f | -d )-f用来设置表示。-d用来删除标志。例如:$ admin -fm TestSample s.myprog.c为源文件指定模块名。当从历史文件中以只读方式提取文件时,源文件中的%M% ID关键字将会被替换成TestSample。如果没有用-fm设置模块名,缺省的模块名是历史文件名中去掉前缀s.的部分。$ admin -dm s.myprog.c删除历史文件中的m标志。-f选项设置的标志:名称可设值说明b无允许产生分支delta。被设置后,get命令可以用-b选项产生分支。CCeildelta最大发行号。缺省为9999。fFloordelta最小发行号。缺省为1。dsidget命令使用的缺省delta号(即SID号)。i无将SCCS的get和delta命令产生的no id keywords消息当成错误,而不是一个警告。j无允许对某个源文件进行并行修改。la 或锁定指定的发行号,以禁止产生新的delta。a表示所有的发行号。Rel1,Rel2对于锁定的发行号,get -e将失败。.n无当某个发行号被跳过时创建空的发行版本。qValue指定源文件中%Q%关键字的值。mModule指定替换%M%关键字的模块名。tType指定替换%Y%关键字的模块名。VProgram指定验证同一个新的delta相关的MR号合法性的程序。5. MR号(-m)MR是修改请求(Modification Request)的缩写。用来对源文件的修改进行跟踪,只有在修改请求和出现故障的情况下,才允许修改,产生新的delta。$ admin -m MRA MRB s.myprog.c6. 校验(-h)检测SCCS文件的校验和与其内容是否一致。$ admin -h s.myprog.c进行校验和检测。$ admin -z s.myprog.c在手工修复遭到破坏的历史文件后重新计算校验和。5.3 文件的提取(get)5.3.1 只读方式的提取(get)使用get命令。$ get s.myprog.c将在当前目录生成myproc.c文件,并且该文件是只读的。get的输出信息有提取出的源文件的版

温馨提示

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

评论

0/150

提交评论