您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > Solaris下C语言编程初步入门.ppt
Solaris10C编程南京天石软件技术有限公司陈锺(QQ:31423047MSN:cz_888@hotmail.com)Solaris—软件开发环境的搭建添加必须的路径信息到环境变量添加如下信息到/.profilePATH=$PATH:/usr/sfw/bin:/usr/local/bin:/usr/local/lib:/usr/ccs/bin;exportPATH复制必须的lib以使gcc工作正常执行如下命令:cp/usr/sfw/lib/libstdc++.so.6/lib/和cp/usr/sfw/lib/libgcc_s.so.1/lib/为了编译gtk软件,例如制图包和一次图:将/usr/lib/pkgconfig/gthread-2.0.pc和/usr/lib/pkgconfig/ORBit-2.0.pc中的-mt替换成-D_REENTRANT重新启动Solaris—SunStudio安装安装SunStudio11安装包为studio11-sol-x86.tar.bz2bzip2-dstudio11-sol-x86.tar.bz2解压tarxfstudio11-sol-x86.tar解包./installer进行安装Solaris—SunStudio安装Solaris—SunStudio安装Solaris—SunStudio安装Solaris—SunStudio安装Solaris—SunStudio安装Solaris—SunStudio安装Solaris—SunStudio安装Solaris—SunStudio安装Solaris—SunStudio安装Solaris—SunStudio安装Solaris—SunStudio安装为SunStudio配置环境在/.profile文件的PATH变量赋值中加入/opt/SUNWspro/binSolaris—gcc在为Unix开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器.目前Linux下最常用的C语言编译器是GCC(GNUCompilerCollection),它是GNU项目中符合ANSIC标准的编译系统,能够编译用C、C++和ObjectC等语言编写的程序.GCC不仅功能非常强大,结构也异常灵活.最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等.开放、自由和灵活是gcc的魅力所在,程序员通过它能够更好地控制整个编译过程.各操作系统的gcc略有不同。Solaris—gcc使用GCC编译程序时,编译过程可以被细分为四个阶段:◆预处理(Pre-Processing)◆编译(Compiling)◆汇编(Assembling)◆链接(Linking)Solaris—软件开发模式模式一每个程序员机器上安装Solaris,使用gedit编写程序或者Sunstudio集成开发。优点:直接编写、编译、调试。缺点:Solaris下其他辅助工具少,Solaris桌面提供的软件相对匮乏,word文档等在windows与Solaris间无法完全兼容。Solaris—软件开发模式模式二每个程序员机器上使用windows,在一台编程调试服务器上安装Solaris。程序员使用Xmanager登陆到服务器的Solaris进行程序编写、编译。优点:双操作系统并存,windows资源丰富,在Solaris下直接编写、编译、调试。缺点:对调试服务器性能要求较高,否则交互速度太慢。Solaris—软件开发模式模式三每个程序员机器上使用windows,在一台编程调试服务器上安装Solaris。使用windows环境编写程序,通过ftp工具将代码传输到服务器的Solaris,通过telnet远程登陆编译。优点:程序编写工具丰富。缺点:必须经过代码传输过程,远程字符模式的编译、修改、调试。Solaris—helloworld.c#includestdio.hintmain(void){printf(Helloworld,Solarisprogramming!\n);return0;}gcchelloworld.c-ohelloworld.o./helloworld.oHelloworld,Solarisprogramming!Solaris—dbxdbx程序调试工具—程序崩溃例子:crash.c1:#includestdio.h2:intmain(void)3:{4:char*ss=NULL;5:sprintf(ss,helloworld!\n);6:printf(ss);7:return0;8:}Solaris—dbx使用-g编译程序,以使编译出来的程序带调试环境gcc-gcrash.c–ocrash.o运行crash.obash-3.00#./crash.o段错误(coredumped)怎么样快速找到问题?Solaris—dbxbash-3.00#dbxcrash.oForinformationaboutnewfeaturessee`helpchanges'Toremovethismessage,put`dbxenvsuppress_startup_message7.5'inyour.dbxrcReadingcrash.oReadingld.so.1Readinglibc.so.1(dbx)runRunning:crash.o(processid1230)signalSEGV(nomappingatthefaultaddress)inmemchrat0xd27044d50xd27044d5:memchr+0x0055:cmpb(%eax),%clCurrentfunctionismain5sprintf(ss,helloworld!\n);(dbx)quitSolaris—dbxdbx程序调试工具—内存泄露例子:leak.c1:#includestdio.h2:intmain(void)3:{4:inti=0;5:printf(“pid=%d\n”,getpid());6:while(i100)7:{8:char*ss=malloc(sizeof(char)*64);9:sprintf(ss,helloworld!\n);10:usleep(100000);11:i++;12:}13:return0;14:}Solaris—dbx使用-g编译程序,以使编译出来的程序带调试环境gcc-gleak.c-oleak.o运行leak.obash-3.00#./leak.opid=1325使用prstat-p13251命令查看leak.o进程状态,怎么SIZE(占用的虚拟内存)和RSS(内存)不断增长?怎么样快速找到内存泄露问题?Solaris—dbxbash-3.00#dbxleak.oForinformationaboutnewfeaturessee`helpchanges'Toremovethismessage,put`dbxenvsuppress_startup_message7.5'inyour.dbxrcReadingleak.oReadingld.so.1Readinglibc.so.1(dbx)dbxenvrtc_mel_at_exitverbose开启结束后显示详细信息(dbx)check-leaks开启内存泄露选项leakschecking-ON(dbx)runSolaris—dbxRunning:leak.o(processid1329)Readingrtcapihook.soReadinglibdl.so.1Readingrtcaudit.soReadinglibmapmalloc.so.1Readinglibgen.so.1Readinglibm.so.2Readingrtcboot.soReadinglibrtc.soRTC:EnablingErrorChecking...RTC:Runningprogram...pid=1329Solaris—dbxCheckingformemoryleaks...Actualleaksreport(actualleaks:100totalsize:6400000bytes)MemoryLeak(mel):Found100leakedblockswithtotalsize6400000bytesAttimeofeachallocation,thecallstackwas:[1]main()atline8inleak.cPossibleleaksreport(possibleleaks:0totalsize:0bytes)executioncompleted,exitcodeis0(dbx)quitSolaris—dbx小结dbx包含在SunStudio中。编译时必须使用-g才能在dbx显示出与源代码相关的调试结果信息。守护进程在调试前,请先使其成为普通进程。调试网络程序时,在dbx调试时使用ignoreSIGPIPE来避免网络信号导致调试中断。Solaris—常用调试手段直接在终端中输出信息如果是守护进程写调试信息文件使用dbx使用sunix系统的web调试平台Solaris—时间函数char*ctime(consttime_t*clock);structtm*localtime(consttime_t*clock);structtm*gmtime(consttime_t*clock);char*asctime(conststructtm*tm);-----------以上非MT-Safechar*ctime_r(consttime_t*clock,char*buf,intbuflen);structtm*localtime_r(consttime_t*restrictclock,structtm*restrictres);structtm*gmtime_r(consttime_t*restrictclock,structtm*restrictres);char*asctime_r(conststructtm*restricttm,char*restrictbuf,intbuflen);-------------------------以上为MT-Safe推荐Solaris—解析传递给程序的参数如何在程序中使用执行时传递过来的参数?例如:./arguments.odebughello=1。带有参数的main()函数头格式如下:intmain(intargc,char*argv[])其中,第一个参数argc是int型的,它用来存放命令行参数的个数,实际上argc所存放的数值比命令行参数的个数多1,即将命令字(可执行文件名)也计算在内。第二个参数argv是一个一维的一级指针数组,它是用来存放命令行中各个参数和命令字的字符串的,并且规定:argv[0]存放命令字argv[1]存放命令行中第一个参数argv[2]存放命令行中第二个参数…这里,argc的值和argv[]各元素的值都是系统自动组赋值的。Solaris—解析传递给程序的参数程序范例#includestdio.hintmain(intargc,char*argv[]){inti=0;printf(Thenumberofcommandlineargumentsis:%d\n,argc);printf(Theprogramnameis:%s\n,argv[0]);printf(Thecommandlinearguments:\n);for(i=1;iargc;i++){printf(argv[%d]:%s\n,i,argv[i]);}return1;}root@server1{/skystone}#./arguments.odebughello=1Thenumberofco
本文标题:Solaris下C语言编程初步入门.ppt
链接地址:https://www.777doc.com/doc-3432602 .html