(ARM Linux嵌入式系统开发基础)第4章LinuxC编程基础.ppt

(ARM Linux嵌入式系统开发基础)第4章LinuxC编程基础.ppt

  1. 1、本文档共111页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章 Linux C编程基础   进程的概念是针对系统而不是针对用户的,对用户来说,面对的是程序。当用户执行程序时,对系统而言,它将启动一个进程。但和程序不同的是,在进程中,系统可能需要再启动一个或多个进程来独立完成的多个任务。多进程编程的主要内容包括进程控制和进程间通信。   Linux下的一个进程在内存里包括三部分的数据,即“代码段”、“堆栈段”和“数据段”。一般的CPU都有上述三种段寄存器,以方便操作系统的运行。这三个部分也是构成完整的执行序列的必要部分。   “代码段”,顾名思义,就是存放了程序代码的数据单元,假如机器中有数个进程运行相同的一个程序,那么就可以使用相同的代码段。“堆栈段”存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。而“数据段”则存放程序的全局变量、常数以及动态数据分配的数据空间(比如用malloc函数取得的内存空间)。系统如果同时运行数个相同的程序,则不能使用同一个堆栈段和数据段。 4.2 Linux下的进程控制   在Linux环境下,有两个基本的操作用于创建和修改进程:函数fork()用来创建一个新的进程,该进程几乎是当前进程的一个完全拷贝;函数族exec()用来启动另外的进程以取代当前运行的进程。Linux的进程控制和传统的UNIX进程控制基本一致,只在一些细节的地方有些区别,例如在Linux系统中调用vfork和fork完全相同。 4.2.1 fork()函数   fork在英文中是“分叉”的意思。一个进程在运行中,如果使用了fork()函数,将产生另一个进程,于是进程就产生“分叉”了。下面具体描述如何使用fork()函数,并通过程序演示使用fork()函数的基本框架: void main(){ int i; if ( fork() == 0 ) { /* 子进程程序 */ for ( i = 1; i 1000; i ++ ) printf(This is child process\n); } else { /* 父进程程序*/for ( i = 1; i 1000; i ++ ) printf(This is process process\n); } }   程序运行后,屏幕上就会交替出现子进程与父进程各打印出的一千条信息。如果程序还在运行中,用ps命令就能看到系统中有两个进程在运行。   调用fork()函数时,fork()函数启动一个新的进程,此进程几乎是当前进程的一个拷贝。子进程和父进程使用相同的代码段;子进程复制父进程的堆栈段和数据段。父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行,虽然继承了父进程的一切数据,但实际上数据已经分开,相互之间不再影响,也就是说,不再共享任何数据。再要交互信息时,只有通过进程间的通信来实现。既然如此相像,系统如何来区分呢?这是由函数的返回值来决定的。   对于父进程,fork()函数返回了子程序的进程号;而对于子程序,fork()函数则返回零。在操作系统中,用ps函数就可以看到不同的进程号,对父进程而言,进程号是由比它更低层的系统调用赋予的;而对于子进程而言,它的进程号即是fork()函数对父进程的返回值。在程序设计中,父进程和子进程都要调用fork()函数下的代码,也就是利用fork()函数对父、子进程的不同返回值用if…else…语句来实现让父、子进程完成不同的功能,上例在执行时两条信息是交互无规则地打印,这是父、子进程独立执行的结果,虽然代码似乎和串行的代码没有什么区别。   大程序在运行时,数据段和堆栈都很大,执行一次fork()函数就要复制一次,那么fork()函数的系统开销如何解决?一般CPU都是以“页”为单位来分配内存空间的,每一个页都是实际物理内存的一个映像,像Intel的CPU,每页通常情况下为4086字节,而无论是数据段还是堆栈段都是由许多“页”构成的,fork()函数复制这两个段,只是“逻辑”上,并非“物理”上的,也就是说,实际执行fork()函数时,物理空间上两个进程的数据段和堆栈段都还是共享着的,当有一个进程写了某个数据时,这时两个进程之间的数据才有了区别,系统就将有区别“页”从物理上也分开,于是系统在空间上的开销就可以达到最小。   下面为一个耗尽机器资源的Linux小程序,其源代码非常简单:   ?void main()  ? {     ?for( ; ; ) fork();    ?}   这个程序死循环地执行fork()函数,其结果是程序不断产生进程,而这些进程又不断产生新的进程,系统资源就被这么多不断产生的进程耗尽。当然只要系统管理员预先给每个用户设置可运行的最大进程数,恶意的程序就可被制止。 4.2.2 exec()函数族   在Linux中要使用exe

文档评论(0)

autohhh + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档