|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果你只是想应付一下操作系统的课程,劝你最好别学,或者说不要指望能用的怎么样。
这学期在学操纵体系,先生安排了一个关于历程的实行题,是在Linux体系中完成的,个中有触及到fork()函数的挪用,刚好我研讨Ubuntu也有一段工夫了,就懂得了下fork()函数,上面把本人实行的一点心得贴下去,也但愿能帮到列位初学者(我也是个初学者)。
先看下我在网上搜刮到的一篇文章,至于原作者找不到了,看体谅。以下:
1.先看上面代码:
#include<stdio.h>
#include<sys/types.h>//pid_t范例界说
#include<unistd.h>//函数fork(),getpid()界说
voidmain()
{
pid_tpid;
pid=fork();
if(pid<0)
printf("errorinfork!");
elseif(pid==0)
printf("iamthechildprocess,myprocessidis%d
",getpid());
else
printf("iamtheparentprocess,myprocessidis%d
",getpid());
}
要弄分明fork的实行历程,就必需先讲分明操纵体系中的“历程(process)”观点。
一个历程,次要包括三个元素:
o.一个能够实行的程序;
o.和该历程相干联的全体数据(包含变量,内存空间,缓冲区等等);
o.程序的实行高低文(executioncontext)。
无妨复杂了解为,一个历程暗示的就是一个可实行程序的一次实行过程当中的一个形态。操纵体系对历程的办理,典范的情形,是经由过程历程表完成的。历程表中的每个表项,纪录的是以后操纵体系中一个历程的情形。关于单CPU的情形而言,每特准时刻只要一个历程占用CPU,可是体系中大概同时存在多个举动的(守候实行或持续实行的)历程。
一个称为“程序计数器(programcounter,pc)”的存放器,指出以后占用CPU的历程要实行的下一条指令的地位。当分给某个历程的CPU工夫已用完,操纵体系将该历程相干的存放器的值,保留到该历程在历程表中对应的表项内里;把将要代替这个历程占用CPU的谁人历程的高低文,从历程表中读出,并更新响应的存放器(这个历程称为“高低文互换(processcontextswitch)”,实践的高低文互换必要触及到更多的数据,那和fork有关,不再多说,次要要记着程序存放器pc指出程序以后已实行到那里,是历程高低文的主要内容,换出CPU的历程要保留这个存放器的值,换进CPU的历程,也要依据历程表中保留的本历程实行高低文信息,更新这个存放器)。
好了,有这些观点打底,能够说fork了。当你的程序实行到上面的语句:
pid=fork();
操纵体系创立一个新的历程(子历程),而且在历程表中响应为它创建一个新的表项。新历程和原有历程的可实行程序是统一个程序;高低文和数据,尽年夜部分就是原历程(父历程)的拷贝,但它们是两个互相自力的历程!此时程序存放器pc,在父、子历程的高低文中都宣称,这个历程今朝实行到fork挪用行将前往(此时子历程不占据CPU,子历程的pc不是真正保留在存放器中,而是作为历程高低文保留在历程表中的对应表项内)。成绩是怎样前往,在父子历程中就各奔前程。
父历程持续实行,操纵体系对fork的完成是,这个挪用在父历程中前往方才创立的子历程的pid(一个正整数),以是上面的if语句中pid<0,pid==0的两个分支都不会实行。以是输入iamtheparentprocess...子历程在以后的某个时分失掉调剂,它的高低文被换进,占有CPU,操纵体系对fork的完成,使得子历程中fork挪用前往0。以是在这个历程(注重这不是父历程了哦,固然是统一个程序,可是这是统一个程序的别的一次实行,在操纵体系中此次实行是由别的一个历程暗示的,从实行的角度说和父历程互相自力)中pid=0,以是输入iamthechildprocess...
我想你对照狐疑的就是,为何看上往程序中互斥的两个分支都被实行了。在一个程序的一次实行中,这固然是不成能的;可是你看到的两行输入是来自两个历程,这两个历程来自统一个程序的两次实行。
上面是我的一点心得,关于子历程的挪用点成绩,以下:
2.子历程的挪用点详解
子历程是从fork()函数入手下手实行的。典范:
#include<stdio.h>
#include<sys/types.h>//pid_t范例界说
#include<unistd.h>//函数fork(),getpid()界说
voidmain()
{
pid_tp1,p2;
p1=fork();
if(p1<0)
printf("errorinfork!");
elseif(p1==0)
printf("childprocesspid:%d
",getpid());
else
printf("parentprocesspid:%d
",getpid());
p2=fork();
if(p2<0)
printf("errorinfork!");
elseif(p2==0)
printf("childprocesspid:%d
",getpid());
else
printf("parentprocesspid:%d
",getpid());
}
</p>12下一页
但不会命令而成为高手也是不可能的.这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不会英语的,但是没有单词词汇量英语水平也提不高的。 |
|