操作系统-Linux环境下C语言编程课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《操作系统-Linux环境下C语言编程课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 Linux 环境 语言 编程 课件
- 资源描述:
-
1、Linux环境下C语言编程2007年10月GCC简介C语言和LinuxnLINUX中包含了很多软件开发工具。它们中的很多是用于C和C+应用程序开发的。nC是一种能在UNIX的早期就被广泛使用的通用编程语言。它最早是由Bell实验室的Dennis Ritchie为了UNIX的辅助开发而写的,从此C就成为世界上使用最广泛的计算机语言。nC能在编程领域里得到如此广泛支持的原因有:n(1)它是一种非常通用的语言,并且它的语法和函数库在不同的平台上都是统一的,对开发者非常有吸引力;n(2)用C写的程序执行速度很快;n(3)C是所有版本UNIX上的系统语言;GNU C编译器-gccnLINUX上可用的C编
2、译器是GNU C编译器,它建立在自由软件基金会编程许可证的基础上,因此可以自由发布。nLINUX 上的GNU C编译器(gcc)是一个全功能的ANCI C兼容编译器,而一般UNIX(如SCO UNIX)用的编译器是CC。文件后缀Gcc编译文件ngcc指令的一般格式为:gcc 选项 要编译的文件选项 目标文件n其中,目标文件可缺省,gcc默认生成可执行的文件为:编译文件.outn如:n gcc o hello hello.cGCC编译流程n预处理(Preprocessing)n编译(Compiling)n汇编(Assembling)n连接(Linking)#includenint main()n
3、nprintf(Hello!This is our world!n);nreturn 0;n预处理阶段n在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc在预处理结束后停止编译过程。n编译命令:gcc E hello.c o hello.ingcc进行了预处理,它把“stdio.h”的内容插入到hello.i文件中。编译阶段n在这个阶段中,Gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc 把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编
4、,生成汇编代码。n编译命令:gcc S hello.i o hello.s汇编阶段n汇编阶段是把编译阶段生成的“.s”文件转成目标文件,在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。n编译命令:gcc c hello.s o hello.o链接阶段n系统把”stdio.h”中的实现都在libc.so.6 库文件中,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6 库函数中去,这样就能实现函数“printf”了。n编译命令:gcc hello.o o hello运行程序nrootlocalhost#./he
5、lloHello!This is our world!Gcc常用编译选项Gdb 调试器nGdb 调试器是一款GNU 开发组织并发布的UNIX/Linux 下的程序调试工具。虽然,它没有图形化的友好界面,但是它强大的功能也足以与微软的VC 工具等媲美。n能监视程序中变量的值n能设置断点以使程序在指定的代码行上停止执行n能一行行执行代码基本gdb 命令nfile 装入想要调试的可执行文件.nkill 终止正在调试的程序.nlist 列出产生执行文件的源代码的一部分.nnext 执行一行源代码但不进入函数内部.nstep 执行一行源代码而且进入函数内部.nrun 执行当前被调试的程序nquit 终止
6、gdbnwatch 使你能监视一个变量的值而不管它何时被改变.nprint 显示表达式的值nbreak 在代码里设置断点,这将使程序执行到这里时被挂起.nmake 能不退出gdb 就可以重新产生可执行文件.nshell 能不离开gdb 就执行UNIX shell 命令.一个调试的例子-#include nint sum(int m);nint main()nnint i,n=0;nsum(50);nfor(i=1;i=50;i+)nnn+=i;nnprintf(The sum of 1-50 is%d n,n);nnint sum(int m)nnint i,n=0;nfor(i=1;i=m;
7、i+)nn+=i;nprintf(The sum of 1-m is%dn,n);n编译程序n使用Gcc对test.c进行编译,注意一定要加上选项“-g”,这样编译出的可执行代码中才包含调试信息,否则之后Gdb 无法载入该可执行文件。n gcc-g gdbtest.c-o gdbtest用Gdb 调试n1 开始调试:gdb gdbtest (gdb)n2 查看文件命令:l 列出带有行号的代码 用Gdb 调试(续)n3设置断点设置断点是调试程序中是一个非常重要的手段,它可以使程序到一定位置暂停它的运行。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。在Gdb 中
8、设置断点非常简单,只需在“b”后加入对应的行号即可。如:(Gdb)b 6Breakpoint 1 at 0 x804846d:file gdbtest.c,line 6.用Gdb 调试(续)n查看断点情况:键入“info b”来查看设置断点情况:(Gdb)info bNum Type Disp Enb Address What1 breakpoint keep y 0 x0804846d in main at test.c:6n4 运行代码:Gdb 默认从首行开始运行代码,可键入“r”(run)即可(若想从程序中指定行开始运行,可在r 后面加上行号)。(Gdb)rStarting progra
9、m:/root/workplace/Gdb/testReading symbols from shared object read from target memory.done.Loaded system supplied DSO at 0 x5fb000Breakpoint 1,main()at test.c:66 sum(50);用Gdb 调试(续)n5 查看变量值在Gdb 中只需键入“p”变量值即可,如下所示:(Gdb)p n$1=0(Gdb)p i$2=134518440用Gdb 调试(续)n6单步运行单步运行可以使用命令“n”(next)或“s”(step),它们之间的区别在于:若
10、有函数调用的时候,“s”会进入该函数而“n”不会进入该函数。(Gdb)nThe sum of 1-m is 12757 for(i=1;i=50;i+)(Gdb)ssum(m=50)at test.c:1616 int i,n=0;用Gdb 调试(续)n7恢复程序运行在查看完所需变量及堆栈情况后,就可以使用命令“c”(continue)恢复程序的正常运行了。这时,它会把剩余还未执行的程序执行完,并显示剩余程序中的执行结果。(Gdb)cContinuing.The sum of 1-50 is:1275Program exited with code 031.Linux 多线程技术 POSIX
11、线程库Pthreadsn使用fork()创建进程 代价昂贵进程间通信方式较复杂操作系统在实现进程间的切换比线程切换更费时 n使用pthreads库创建线程创建进程比创建线程更快线程间的通信方式更容操作系统对线程的切换比对进程的切换更容易和快速 线程的创建#include int pthread_create(pthread_t *thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);第一个参数为指向线程标识符的指针。第二个参数用来设置线程属性。第三个参数是线程运行函数的起始地址。最后一个参数是运行函数的参数。当创建线
12、程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。一个简单例子n#include#include#include#include#includepthread_t ntid;void*thr_fn(void*arg)printids(new thread:);return(void*)0);int main()int err;err=pthread_create(&ntid,NULL,thr_fn,NULL);if(err!=0)printf(cant cr
13、eate thread:%sn,strerror(err);return 1;sleep(1);return 0;编译多线程程序ngcc-o mypthread-lpthread mypthread.c线程的退出 n调用pthread_exit()结束线程执行 void pthread_exit(void*retval);n让线程处理程序返回 n使用 pthread_cancel()函数终止其他线程的执行 int pthread_cancel(pthread_t thread);向线程t发送取消请求,默认情况下线程thread自己调用pthread_exit(PTHREAD_CANCELED)
14、,等待线程结束 n使用 pthread_join()函数等待被创建的线程结束 npthread_join()函数会挂起创建线程的线程的执行 n直到等待到想要等待的子线程 n函数原型:int pthread_join(pthread_t th,void*thread_return);线程的分离 n主线程可以不断地创建子线程 n子线程本身自己有自我回收内存资源的能力 n函数原型:int pthread_detach(pthread_t th);npthread_detach()和 pthread_join()一般情况下不能同时使用 获得当前线程的标志npthread_t pthread_self(
15、void);n本函数返回本线程的标识符。n在LinuxThreads中,每个线程都用一个pthread_descr结构来描述,其中包含了线程状态、线程ID等所有需要的数据结构,此函数的实现就是在线程栈帧中找到本线程的pthread_descr结构,然后返回其中的p_tid项。一个例子#include#include#include#include#define THREAD_NUMBER 2int retval_hello1=2,retval_hello2=3;void*hello1(void*arg)char*hello_str=(char*)arg;sleep(1);printf(%sn,
16、hello_str);pthread_exit(&retval_hello1);void*hello2(void*arg)char*hello_str=(char*)arg;sleep(2);printf(%sn,hello_str);pthread_exit(&retval_hello2);int main(int argc,char*argv)int i;int ret_val;int*retval_hello2;pthread_t ptTHREAD_NUMBER;const char*argTHREAD_NUMBER;arg0=hello world from thread1;arg1=
17、hello world from thread2;printf(Begin to create threads.n);ret_val=pthread_create(&pt0,NULL,hello1,(void*)arg0);if(ret_val!=0)printf(pthread_create error!n);exit(1);ret_val=pthread_create(&pt1,NULL,hello2,(void*)arg1);if(ret_val!=0)printf(pthread_create error!n);exit(1);printf(Begin to wait for thre
18、ads.n);for(i=0;i THREAD_NUMBER;i+)ret_val=pthread_join(pti,(void*)&retval_helloi);if(ret_val!=0)printf(pthread_join error!n);exit(1);else printf(return value is%dn,*retval_helloi);printf(Now,the main thread returns.n);return 0;线程属性的初始化和撤销n线程初始化:int pthread_attr_init(pthread_attr_t*attr)初始化线程属性对象attr
19、,并用默认值填充n线程撤销:int pthread_attr_destroy(pthread_attr_t*attr)销毁线程属性对象attr。pthread_attr_t定义npthread_attr_t定义:typedef struct _pthread_attr_s int _detachstate;int _schedpolicy;struct _sched_param _schedparam;int _inheritsched;int _scope;size_t _guardsize;int _stackaddr_set;void*_stackaddr;size_t _stacksi
20、ze;pthread_attr_t;线程的属性属性名意义 detachstate选择被创建的线程是处于可加入的状态还是选择被创建的线程是处于可加入的状态还是分离状态分离状态 schedpolicy为被创建的线程选择调度策略。为被创建的线程选择调度策略。schedparam为被创建的线程选择调度参数。为被创建的线程选择调度参数。inheritsched选择对新创建的线程的调度策略和调度参数选择对新创建的线程的调度策略和调度参数是否被是否被schedpolicy 和和schedparam 属性决属性决定或者是通过父线程继承而得到的定或者是通过父线程继承而得到的 scope为选择被创建的线程调度竞争
21、范围。为选择被创建的线程调度竞争范围。线程的属性(续)detachstatePTHREAD_CREATE_JOINABLEPTHREAD_CREATE_DETACHED默认:默认:PTHREAD_CREATE_JOINABLE控制创建的线程是控制创建的线程是joinable态还是态还是detached态态schedpolicySCHED_OTHER(regular,non-realtimescheduling)SCHED_RR(realtime,round-robin)SCHED_FIFO(realtime,first-infirst-out)默认:默认:SCHED_OTHER优先级类别优先级
22、类别Schedparam默认:默认:0线程优先级参数线程优先级参数如果如果schedpolicy的值为的值为SCHED_OTHER,schedpolicy此属性无关紧要此属性无关紧要线程创建后可修改此属性线程创建后可修改此属性inheritschedPTHREAD_EXPLICIT_SCHEDPTHREAD_INHERIT_SCHED默认:默认:PTHREAD_EXPLICIT_SCHED说明此线程优先级是否继承于父线程还是通过说明此线程优先级是否继承于父线程还是通过上面两个属性确定上面两个属性确定scopePTHREAD_SCOPE_SYSTEMPTHREAD_SCOPE_PROCESS默认
23、:默认:PTHREAD_SCOPE_SYSTEM设置线程绑定状态设置线程绑定状态部分部分Linux不支持不支持PTHREAD_SCOPE_PROCESS,需要查看,需要查看man相关函数-分离状态n设置分离状态:设置分离状态:pthread_attr_setdetachstateint pthread_attr_setdetachstate(pthread_attr_t*attr,int detachstate);返回值:函数成功返回0;任何其他返回值都表示错误 设置分离状态。参数detachstate的值为:PTHREAD_CREATE_DETACHED、PTHREAD_CREATE_JOI
24、NABLE。n获取分离状态:获取分离状态:pthread_attr_getdetachstateint pthread_attr_getdetachstate(pthread_attr_t*attr,int*detachstate);返回值:函数成功返回0;任何其他返回值都表示错误 取线程分离状态:分离的或是非分离的。相关函数-调度策略n设置调度策略:设置调度策略:pthread_attr_setschedpolicyint pthread_attr_setschedpolicy(pthread_attr_t*tattr,int policy);返回值:函数成功返回0;任何其他返回值都表示错误
25、。POSIX标准定义的调度策略有:SCHED_FIFO(先入先出)、SCHED_RR(循环)、SCHED_OTHER(由不同版本的POSIX线程库定义的缺省调度策略)。n获取调度策略:获取调度策略:pthread_attr_getschedpolicyint pthread_attr_getschedpolicy(pthread_attr_t*tattr,int*policy);返回值:函数成功返回0;任何其他返回值都表示错误。相关函数-调度参数n设置调度参数:设置调度参数:pthread_attr_setschedparamint pthread_attr_setschedparam(pth
展开阅读全文