系统调用fork创建一个新进程.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
系统调用fork创建一个新进程.ppt

1 fork:创建新进程 系统调用fork创建一个新进程,但新进程的指令段,用户数据段,用户堆栈段都是旧进程一模一样的复制。系统数据段也几乎全是旧进程的复制。 原先的进程被称作“父进程”,新创建的进程被称作“子进程”。在UNIX中,fork系统调用是创建新进程的惟一方式。fork调用惟一能出错的原因是系统中的资源耗尽。 进程执行fork()系统调用,创建出一个新的进程。新的进程叫做子进程,原先的进程叫父进程。组成进程的四个要素中,子进程的指令段,数据段,用户堆栈段,统统都是父进程一模一样的复制。子进程的系统数据段也几乎都是父进程的复制,PCB中只有很少的几个成员父子不同,这至少包括进程标识号PID。这种子进程的初始状态复制父进程的方法,叫“继承”。从此以后,父子进程各自都有一套自己独立的数据和指令,以后的发展,父子进程可以有不同的行为,父子进程对数据的修改也互不影响。 【例7-6】 使用fork创建子进程。 $ cat fork1.c int a; int main(int argc, char **argv) { int b; printf([1] %s: BEGIN\n, argv[0]); a = 10; b = 20; printf([2] a+b=%d\n, a + b); fork(); a += 100; b += 100; printf([3] a+b=%d\n, a + b); printf([4] %s: END\n, argv[0]); } 上述程序在执行时,进程执行到fork()系统调用,创建出一个新的进程。从执行a += 100开始,父子进程各有自己一套执行流在独立的执行。这条语句操作的是用户数据区中的变量a,父子进程操作的都是各自私有的数据,互不影响。 b += 100;访问用户堆栈区的数据b,同样的,父子进程互不影响。 printf需要在当前终端上打印,该库函数最终引用文件描述符1,文件描述符是进程系统数据段里的内容,在创建新进程的时候,子进程抄写的跟父进程一样。因此,子进程也是在当前的终端上打印,而不是输出到别的终端上。 最后一个printf引用的argv是main函数的实参,在堆栈区内,argv[0]指针指向的存储空间是堆栈栈底存放的一些数据,尽管父子进程输出的结果完全相同,但却是父子进程各自引用自己私有的堆栈段中数据的结果。因为子进程堆栈段抄写的跟父进程一样,而且新进程创建后父子进程都未修改它们,所以输出结果会相同。 下面是上述程序的执行结果: $ ./fork1 [1] ./fork1: BEGIN [2] a+b=30 [3] a+b=230 [4] ./fork1: END [3] a+b=230 [4] ./fork1: END 这就是fork()创建新进程的方法。从概念上讲,子进程指令段,数据段,堆栈段都是父进程的复制。从逻辑上看,可以理解子进程和父进程有各自独立的私有存储空间,并且子进程的初始状态是父进程的复制。了解了内核处理的这些技术,就不用担心这样做会占用很多内存。 必须有一种方法在程序中区分开父进程和子进程,让父子进程执行不同的程序代码,这样才有意义。 区分父子进程的方法就是依靠fork()系统调用的返回值。fork执行返回后,有两个执行流,两个进程(父和子)都收到返回值,是一个整数,但这两个值不相同。返回值很关键,它用于区分父进程和子进程。例如: int p; p = fork();? 那么,这条语句可以分解为两个动作: ① 执行fork()系统调用; ② 给变量p赋值。 按照fork()系统调用的功能,执行完①后,新产生一个子进程,子进程是父进程的复制。接下来的操作②就会有两个进程分别在自己独立的地址空间内执行,各有自己独立的p变量。但是,操作系统对系统调用的处理导致函数调用fork()在父子进程中有不同的返回值。在对p赋值时,父进程的p得到一个正整数,而子进程的p得到0。程序据此区分父子进程,父进程得到的正整数是子进程的PID号。 【例7-7】 fork创建子进程,父子进程执行不同的程序段。? $ cat fork2.c int main(int argc, char *argv[]) { int p; printf([1] %s: BEGIN\n, argv[0]); p = fork(); if (p 0) { printf([2] Parent, p=%d\n, p); } else if (p == 0) { printf([3] Child, p=%d\n, p); } else

文档评论(0)

ailuojue + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档