- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3.进程控制
3.1. fork 函数
第30章进程
fork调用失败则返回-1,调用成功的返回值见下面的解释。我们通过一个例子 来理解fork是怎样创建新进程的。
例 30.3. fork
[#inelude sys/types.h
i #inelude vunistd.h
I
#in elude stdio.h
:#inelude stdlib.h
int main( void)
{
pid_t pid;
char *message;
int n;
pid = fork();
if (pid 0) {
perror(fork
failed);
exit(1);
}
if (pid == 0) {
message = This is
[the childn;
1
f n = 6;
} else {
message = This is
the pare nt\n;
n = 3;
}
for(; n 0; n--) {
prin tf(message);
sleep(1);
}
return 0;
}
$ ./a.out
! This is the child
J This is the pare nt
£ This is the child
This is the pare nt
This is the child
0这个程序的运行过程如下图所示图 304 forkParentint nainO{pidt pidj char +message; int n;forkO ;Childmain ()
0
这个程序的运行过程如下图所示
图 304 fork
Parent
int nainO
{
pidt pidj char +message; int n;
forkO ;
Child
main ()
int {
VPid it (pid 0} {
perrorCfork failed); exit(l)j
} if (pid == 0) {
message = This is the child\ni n = 6;
} else {
□message = This is the parentXn; n = 3j
} fort; n Oj n--) {
7 printf(message);sleep (1);
}
return 0;
}
pid_t pid; char *message; int n;
pid = fork ():
if
if
(pid 0) { perrorffork failed);
exit(1);
(pid == 0) (message = n = 6; 丁else {
message = n = 3;
}
fort; n 0; n--) {
7 printf(message); si总即(1):
}
return 0;
This is the childMi j
This is the parent\n;
父进程初始化。
父进程调用fork,这是一个系统调用,因此进入内核。
内核根据父进程复制出一个子进程,父进程和子进程的 PCB信息
相同,用户态代码和数据也相同。因此,子进程现在的状态看起来 和父进程一样,做完了初始化,刚调用了 fork进入内核,还没有 从内核返回。
现在有两个一模一样的进程看起来都调用了 fork进入内核等待从
内核返回(实际上fork只调用了一次),此外系统中还有很多别 的进程也等待从内核返回。是父进程先返回还是子进程先返回, 还 是这两个进程都等待,先去调度执行别的进程,这都不一定,取决 于内核的调度算法。
如果某个时刻父进程被调度执行了,从内核返回后就从 fork函数
返回,保存在变量pid中的返回值是子进程的id,是一个大于0 的整数,因此执下面的else分支,然后执行for循环,打印This is the pare nt\n 三次之后终止。
如果某个时刻子进程被调度执行了,从内核返回后就从 fork函数
返回,保存在变量pid中的返回值是0,因此执行下面的if (pid == 0)分支,然后执行for循环,打印This is the childn 六次之 后终止。fork调用把父进程的数据复制一份给子进程,但此后二 者互不影响,在这个例子中,fork调用之后父进程和子进程的变 量message和n被赋予不同的值,互不影响。
父进程每打印一条消息就睡眠1秒,这时内核调度别的进程执行,
在1秒这么长的间隙里(对于计算机来说 1秒很长了)子进程很
有可能被调度到。同样地,子进程每打印一条消息就睡眠1秒,在 这1秒期间父进程也很有可能被调度到。所以程序运行的结果基本 上是父子进程交替打印,但这也不是一定的,取决于系统中其它进 程的运行情况和内核的调度算法,如果系统中其
您可能关注的文档
最近下载
- 新版VDA6.3-2023过程审核精品教程(培训课件).pptx VIP
- 2025贵州黔东南州凯里市选聘城市社区工作者150人备考练习试题及答案解析.docx VIP
- 防恐反恐教育培训制度.docx VIP
- 2025贵州黔东南州凯里市选聘城市社区工作者150人笔试备考试题及答案解析.docx VIP
- 四川省事业单位综合知识针对四川讲义国情省情.pdf VIP
- ZOOM声乐乐器F8n Pro Operation Manual说明书用户手册.pdf
- 宁波市送达地址确认书.pdf VIP
- 内蒙古军航钨钼稀土科技有限公司钨、钼制品生产项目环境影响报告表.pdf VIP
- 【抗战胜利80周年】铭记伟大胜利汲取奋进力量抗战胜利80周年.pptx VIP
- 工程高大模板工程监理实施细则.doc VIP
文档评论(0)