iii. linux系统编程_ 30进程_3 进程控制

iii. linux系统编程_ 30进程_3 进程控制

ID:14084560

大小:101.50 KB

页数:17页

时间:2018-07-25

iii. linux系统编程_ 30进程_3 进程控制_第1页
iii. linux系统编程_ 30进程_3 进程控制_第2页
iii. linux系统编程_ 30进程_3 进程控制_第3页
iii. linux系统编程_ 30进程_3 进程控制_第4页
iii. linux系统编程_ 30进程_3 进程控制_第5页
资源描述:

《iii. linux系统编程_ 30进程_3 进程控制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第 30 章 进程3. 进程控制3.1. fork函数#include#includepid_tfork(void);fork调用失败则返回-1,调用成功的返回值见下面的解释。我们通过一个例子来理解fork是怎样创建新进程的。例 30.3. fork#include#include#include#includeintmain(void){pid_tpid;char*mess

2、age;intn;pid=fork();if(pid<0){perror("forkfailed");exit(1);}if(pid==0){message="Thisisthechild";n=6;}else{message="Thisistheparent";n=3;}for(;n>0;n--){printf(message);sleep(1);}return0;}$./a.outThisisthechildThisistheparentThisisthechildThisisthepare

3、ntThisisthechildThisistheparentThisisthechild$ThisisthechildThisisthechild这个程序的运行过程如下图所示。图 30.4. fork1.父进程初始化。2.父进程调用fork,这是一个系统调用,因此进入内核。3.内核根据父进程复制出一个子进程,父进程和子进程的PCB信息相同,用户态代码和数据也相同。因此,子进程现在的状态看起来和父进程一样,做完了初始化,刚调用了fork进入内核,还没有从内核返回。4.现在有两个一模一样的进程看起来都调用

4、了fork进入内核等待从内核返回(实际上fork只调用了一次),此外系统中还有很多别的进程也等待从内核返回。是父进程先返回还是子进程先返回,还是这两个进程都等待,先去调度执行别的进程,这都不一定,取决于内核的调度算法。1.如果某个时刻父进程被调度执行了,从内核返回后就从fork函数返回,保存在变量pid中的返回值是子进程的id,是一个大于0的整数,因此执下面的else分支,然后执行for循环,打印"Thisistheparent"三次之后终止。2.如果某个时刻子进程被调度执行了,从内核返回后就从fo

5、rk函数返回,保存在变量pid中的返回值是0,因此执行下面的if(pid==0)分支,然后执行for循环,打印"Thisisthechild"六次之后终止。fork调用把父进程的数据复制一份给子进程,但此后二者互不影响,在这个例子中,fork调用之后父进程和子进程的变量message和n被赋予不同的值,互不影响。3.父进程每打印一条消息就睡眠1秒,这时内核调度别的进程执行,在1秒这么长的间隙里(对于计算机来说1秒很长了)子进程很有可能被调度到。同样地,子进程每打印一条消息就睡眠1秒,在这1秒期间父进

6、程也很有可能被调度到。所以程序运行的结果基本上是父子进程交替打印,但这也不是一定的,取决于系统中其它进程的运行情况和内核的调度算法,如果系统中其它进程非常繁忙则有可能观察到不同的结果。另外,读者也可以把sleep(1);去掉看程序的运行结果如何。4.这个程序是在Shell下运行的,因此Shell进程是父进程的父进程。父进程运行时Shell进程处于等待状态(第 3.3 节“wait和waitpid函数”会讲到这种等待是怎么实现的),当父进程终止时Shell进程认为命令执行结束了,于是打印Shell提示符,

7、而事实上子进程这时还没结束,所以子进程的消息打印到了Shell提示符后面。最后光标停在Thisisthechild的下一行,这时用户仍然可以敲命令,即使命令不是紧跟在提示符后面,Shell也能正确读取。fork函数的特点概括起来就是“调用一次,返回两次”,在父进程中调用一次,在父进程和子进程中各返回一次。从上图可以看出,一开始是一个控制流程,调用fork之后发生了分叉,变成两个控制流程,这也就是“fork”(分叉)这个名字的由来了。子进程中fork的返回值是0,而父进程中fork的返回值则是子进程的id

8、(从根本上说fork是从内核返回的,内核自有办法让父进程和子进程返回不同的值),这样当fork函数返回后,程序员可以根据返回值的不同让父进程和子进程执行不同的代码。fork的返回值这样规定是有道理的。fork在子进程中返回0,子进程仍可以调用getpid函数得到自己的进程id,也可以调用getppid函数得到父进程的id。在父进程中用getpid可以得到自己的进程id,然而要想得到子进程的id,只有将fork的返回值记录下来,别无它法。fo

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。