仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 558|回复: 8
打印 上一主题 下一主题

[其他Linux] 来看看:Linux体系挪用fork()用法详解

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 11:52:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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下一页


但不会命令而成为高手也是不可能的.这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不会英语的,但是没有单词词汇量英语水平也提不高的。
变相怪杰 该用户已被删除
沙发
 楼主| 发表于 2015-1-16 13:22:09 | 只看该作者

来看看:Linux体系挪用fork()用法详解

但不会命令而成为高手也是不可能的.这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不会英语的,但是没有单词词汇量英语水平也提不高的。
  上述程序的编译实行了局以下:
  jenner@Intrepid:~/Desktop$gcc01.c-o01
  jenner@Intrepid:~/Desktop$./01
  childprocesspid:14844
  childprocesspid:14845
  parentprocesspid:14844
  parentprocesspid:14843
  childprocesspid:14846
  parentprocesspid:14843
  正文:最后的43号历程实行两个fork(),输入两个parent43,并发生子历程44号和45号;
  44号历程从第一个fork()函数入手下手实行,输入child44,挪用第二个fork(),输入parent44,并发生子历程46号;
  45号历程从第二个fork()函数入手下手实行,输入child45;
  46号历程从第二个fork()函数入手下手实行,输入child46;
  至此程序停止。
  注重:以上历程不是程序的前后运转历程,那六个输入的前后按次是不断定的!
  程序中一切历程的父子干系以下:
  父历程43---子历程44
  ---子历程的子历程46
  ---子历程45
  个中44号历程既是43号历程的子历程,又是46号历程的父历程。
  以上是我的一些心得,看着大概有点绕口,耐烦点,我也研讨了很久呢,假如你看懂了,fork()函数也就算基础了解了!
  特地也把先生安排的功课题也贴下去吧,呵呵,以下:
  3.标题:历程的创立:体例一段程序,利用体系挪用fork()创立两个子历程,如许在此程序运转时,在体系中就有一个父历程和两个子历程在举动。让每个历程在屏幕上显现一个字符:父历程显现字符a,子历程分离显现字符b和字符c。试察看、纪录并剖析屏幕上,历程调剂的情形。
  代码以下:
  #include<stdio.h>
  #include<sys/types.h>
  #include<unistd.h>
  voidmain()
  {
  pid_tp1,p2;
  p1=fork();
  if(p1<0)
  printf("errorinfork!\n");
  elseif(p1==0)
  printf("childprocessb\n");
  else
  {
  p2=fork();
  if(p2<0)
  printf("errorinfork!\n");
  elseif(p2==0)
  printf("childprocessc\n");
  else
  printf("parentprocessa\n");
  }
  }
</p>
上一页12


对于linux命令,一定要学会用man和info去查他们的解释;
深爱那片海 该用户已被删除
板凳
发表于 2015-1-18 16:47:32 | 只看该作者
Linux简单,占内存少,特别是对于程序开发人员来说很方便,如果说windows的成功在于其方便用户的窗口管理界面。
乐观 该用户已被删除
地板
发表于 2015-1-27 12:46:37 | 只看该作者
众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。
金色的骷髅 该用户已被删除
5#
发表于 2015-2-5 13:36:13 | 只看该作者
工具书对于学习者而言是相当重要的。一本错误观念的工具书却会让新手整个误入歧途。目前国内关于Linux的书籍有很多不过精品的不多。
老尸 该用户已被删除
6#
发表于 2015-2-12 02:49:13 | 只看该作者
这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。?
飘灵儿 该用户已被删除
7#
发表于 2015-3-11 08:32:43 | 只看该作者
对我们学习操作系统有很大的帮助,加深我们对OS的理解。?
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-18 07:25:15 | 只看该作者
Linux?最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具,所以Linux操作系统有着广泛的应用空间。
9#
发表于 2015-3-25 18:29:53 | 只看该作者
在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 16:28

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表