《【精品】02Unix编程培训讲义.doc》由会员分享,可在线阅读,更多相关《【精品】02Unix编程培训讲义.doc(22页珍藏版)》请在金锄头文库上搜索。
1、海量管理资源免费下载!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,常见
2、的是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
3、 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 编译过程主要分为编译和链接两大步。具体过程:编译预处理编译优化汇编链接。编译预处理宏定义替换、条件编译、头文件包含、特殊符号(_FI
4、LE_、_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:保留注释;
5、-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等;字符分
6、类(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动态库:所有内容被映射到进程虚地址空间中。执行文件小,内存占用小。但是运行时必需存在连接的库。静态库:执行文件只包含所需要的代码。执行文件大,内存占用大。但是运
7、行时不需要连接的库。-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 -K
8、PIC -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 指
9、明进行静态或动态连接。环境变量 LD_LIBRARY_PATH可以包括两部分,用分号隔开。搜索顺序:LD_LIBRARY_PATH中;的前半部-L指定的目录LD_LIBRARY_PATH中;的后半部标准位置2.3.5 动态连接程序搜索目录连接阶段搜索方法同2.3.4。运行阶段使用环境变量LD_RUN_PATH指明自定义的动态库的位置。标准位置只有/usr/lib。运行阶段的搜索也可以使用LD_LIBRARY_PATH环境变量,而且效果更好,因为即使动态库被移到另一个目录,也可以被找到。尽量不要使用硬编码(连接时指定库文件名的全路径名),因为这样的话,当动态库所在目录被移动后,运行不会成功。对于
10、静态库无此问题(想想看,为什么?)。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选项
11、。运行时应去掉此选项,尤其是在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当前在函数
12、调用堆栈的哪一级,程序中断处的源文件名和行数print显示变量的值(只显示一次)访问源文件cd改变目录pwd当前目录edit编辑文件file改变当前源文件files列出所有的源文件的名称func列出当前函数名funcs列出所有的函数名line改变当前行list显示几行源程序search在文件中搜索字符串use设置目标搜索路径运行时检查check -access | -leaks | -memuse | -alluncheckshowleaksshowmemusesuppressunsuppress杂项commands列出dbx的命令和简要解释help求助命令,后可跟希望得到解释的命令dalia
13、s显示别名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指定源
14、程序所在目录-P指定正在运行的进程的IDobjectfile执行文件corefilecore文件窗口模式命令ts切换分屏模式(源程序窗口、汇编窗口)w size设置源程序窗口的行数(最多为主窗口行数减3)u刷新屏幕U清除并重画屏幕路径映射命令D 目录名定义源程序所在目录,目录名要用引号括起来文件查看命令v显示下一屏程序v 行号显示指定行号的程序,放在窗口中央v 文件名:行号显示指定文件,放在窗口中央L显示文件名、进程名、行号、当前行程序+ 行数向前移动指定行数(缺省为1行)- 行数向后移动指定行数(缺省为1行)/ 字符串向前搜索字符串(缺省为上次搜索的字符串)? 字符串向后搜索字符串(缺省为上次搜索的字符串)n重复上一次的/或?命令N与n命令类似,但是方向相反显