fork如何做到返回两次

要搞清楚fork的表演课程,率先要清楚的Mac 操作体系说得中肯课程设想。。本人促进,它次要包罗三个元素: 

本人可以表演的顺序; 
与O相关性的个人财产最高纪录(包罗变量)。,希腊字母第12字量,起缓冲作用的人等。; 
O顺序的表演背景(表演背景)。 

也好复杂拘押,课程表现,表演可表演顺序的公务的。。Mac 操作体系对课程的办理,类型的保持健康,这是经过课程表达到结尾的的。。促进表说得中肯每个表项,记载礼物Mac 操作体系中促进的公务的。。就独奏CPU的保持健康,每本人指定的时期只因为本人促进服务CPU,只因为体系中可能性在多个使焦虑(注意到表演或合作)。。 

本人叫做顺序自动记录器,PC流露,训令要由礼物表演的下又训令的地方。。 

分有理数促进的CPU时期早已跑出去了。,Mac 操作体系将该促进相关性的完整符合的值,禁猎到促进表说得中肯相配表项。;促进的背景,将服务促进的CPU。,从促进表中大声朗诵,并补充相配的完整符合(如此课程称为“背景调换(process context switch)”,现实的背景调换触及更多的最高纪录。,那和fork有关,不再说,要紧的是要记取,顺序完整符合PC训令,是课程背景的要紧使成比例,转变CPU的课程是禁猎完整符合的值。,替换为CPU的课程,背景人也粉底保在TH说得中肯促进表演。,补充此完整符合。 

好了,有这些设想。,可谓fork了。当顺序表演以下声明时: 
pid=fork();  
Mac 操作体系到达本人新促进(子促进),并相配地在促进表中设置本人新的表项。。新促进是与ORI的可表演课程相似的的课程。;背景和最高纪录,它们大半是原始课程(父促进)的拷贝。,但它们是两个孤独的课程。!顺序流露PC在如此刻候,在父、子课程索取者的背景,如此促进眼前表演到fork祈求救助临到反复(此刻子促进不扣留CPU,子促进的PC无真正保在完整符合中。,它希腊字母第12字在促进表中对应的表项中作为PRO。。问题是多少反复,爷儿俩交托。 

父促进持续表演。,Mac 操作体系对fork的意识到,使祈求救助反复子促进的PID(无符号整数)。,因而PID在上面的if声明中<0, pid==0的两个发枝的都弱表演。因而输入谈话家长的课程... 

子课程是嗣后的调整器。,其背景变为,服务CPU,Mac 操作体系对fork的意识到,使得子促进中fork祈求救助反复0。因而在如此课程中(注意到这不是父促进)。,固然它是同本人顺序,但这是恒等的顺序的可供选择的事物表演方法。,在Mac 操作体系中这次表演是由撇开课程表现,PID=0与表演课程说得中肯父促进有关。如此课程在表演课程中持续。,IF声明说得中肯PID<0不满足,只因为pid==0是true。因而输入谈话孩子的课程... 

我以为你更困惑了。,为什么显现顺序说得中肯个人财产两个彼此反对票的发枝的都是。在表演顺序时,自然,这是弱有的性的。;只因为,您留心的两行输入是人两个促进。,这两个课程是人同本人顺序的两个表演。。

  撇开:fork前父促进的东西子促进可以争吵,而在fork后子促进无什么都可以和父促进的争吵相干了。子课程中到达的是子促进。,父促进中到达的是父促进。。它可以完整考虑两个课程。。

看本人侦查:

#include <  
#include 

main ()  
{  
pid_t pid;  
printf(“fork!”);    // printf(“fork!/n”); 
pid=fork();  

中频(PID)< 0)  
printf(“error in fork!”);  
不然,万一(PID=0)
谈话孩子的课程,我的促进ID是%d/n,getpid());  
else  
谈话父促进,我的促进ID是%d/n,getpid());  
}

 

出现  
[根@土著人主要的C]
fork!谈话孩子的课程,我的促进ID是4286
fork!谈话家长的课程,我的促进ID是4285

但改成printf(“fork!后,出现 
[根@土著人主要的C]
fork!  
谈话孩子的课程,我的促进ID是4286
谈话家长的课程,我的促进ID是4285

为什么只因为本人fork!特征出现?为什么结局本人有2个?

APUE的P143说:
fork先发制人祈求救助了printf一次,当fork之后,行最高纪录仍在缓存中。,因此将父促进最高纪录中间再版到子促进。,缓存的最高纪录也被再版到子促进中。。

在printf()与fork()私下再加本人有或起作用fflush(0),你可以留心它是多少达到结尾的的。

#include 
主(空)
{
特征(哈喽);
FFLUH(STDUT)
fork();
中断(0)
}
因而只因为输入您好
 
理由是stdin,stdout,STDRR是行起缓冲作用的人 

清空起缓冲作用的人弱有两个输入。:setbuf(stdout, NULL)或setvbuf(stdout, NULL, _IONBF, 0)

This entry was posted in 老虎机游戏在线玩. Bookmark the <a href="https://www.mej360.com/lhjyxzxw/2094.html" title="Permalink to fork如何做到返回两次" rel="bookmark">permalink</a>.

发表评论

电子邮件地址不会被公开。 必填项已用*标注