当前位置:  技术问答>linux和unix

初学操作系统,对于fork()函数有多处不理解,拜求大家赐教

    来源: 互联网  发布时间:2017-01-23

    本文导语:  先举个最简单的实例 #include main(){ printf("公共程序段"); int p1=fork(); if(p1==0) printf("子程序段"); else printf("父程序段"); } 大家都知道,fork函数在此处有个现象,就是执行一次,返回两次。 在这里我起初对于如何实...

先举个最简单的实例
#include
main(){
printf("公共程序段");

int p1=fork();
if(p1==0)
printf("子程序段");
else
printf("父程序段");
}
大家都知道,fork函数在此处有个现象,就是执行一次,返回两次。

在这里我起初对于如何实现执行一次,返回两次有疑问,既然子进程中有fork这段代码,那就应该是执行两次,返回两次,也就是说子进程会再通过fork创建自己的子进程,如此循环往复,直到达到系统的进程表的上限。

后来,我通过查阅资料,对这个机制有了进一步理解。
进程映像分为三部分:可执行程序、数据、和进程控制块中的上下文等信息。而操作系统为了实现多进程并发执行,就采用一系列调度算法,进程就不得不在执行过程中断断续续,进程在让出CPU后等待一段时间再一次轮到自己执行时,系统必须知晓它上次停下之前执行到哪里了,记录这个信息并不难,因为程序在运行时有个寄存器,大概叫程序寄存器记录了下一条要执行的指令所在的地址,所有在程序不得不停下让出时间片时,系统就把那个程序寄存器中的地址记录到进程页中,下一次再轮到那个进程执行时不至于把那个进程从头开始执行,而是从上次停下的地方执行。

那么再回到进程创建的问题。
我例子中的程序,执行到int p1=fork()的时候,我理解中是fork内部可以宏观的分为两部分:1、创建子进程;2、返回所创建的进程的进程号。
当父进程执行到fork内部的第一部分时,即创建了进程,但是尚未返回子进程的进程号时,进程控制块中一直都实时记录这进程运行到了哪里,当然此时的记录是“该进程运行到了fork函数的第一层,尚未返回”。这里问题的关键出来了,子进程是按照父进程的模板刻画的,它现在已经在进程页表里面了,下一步就轮到它执行了,最精彩的部分开始出现了,它的页表项信息中居然记录这这样一条信息“该进程已经运行到fork函数的第一层,尚未返回”,所以,当时间片轮到子进程的时候,它直接就按照记录执行下一步,既然fork的创建工作已经执行了,那我就直接返回。通俗的说,子进程不是从头开始执行程序的代码段,而是从“fork函数返回”这里开始执行的,这样子就可以解释为什么fork函数只执行一次,而返回两次,因为在子进程中它没有执行创建子进程的工作,而是直接返回了0。


但是,新的问题又出现了,如果按照我上述那么理解,那么子进程就不会执行公共程序段printf("公共程序段");
所以我上面的理解一定是错误的,或者有相当大的问题的,请大侠们指正,只需回答我三个疑点:
一、为什么子进程中的fork不会再创建新的进程
(如果你的回答是fork执行一次,返回两次,那么请看下面问题)
二、fork为什么会执行一次,返回两次呢,这是什么机制实现的

|
这个确实不好理解

初学只需要记住,从fork返回开始,就根据返回值当作两个程序来对待

至于fork返回之后,是父进程先执行,还是子进程先执行,这个不一定的

|
fork是个系统调用,进入内核,内核就会生成子进程,这个时候不是什么fork执行一次,返回两次,而是父子进程各返回一次,只是内核把父子进程从fork返回的返回值设置得不同而已。

    
 
 

您可能感兴趣的文章:

  • 初学者的困惑,请各位大侠赐教。
  • 初学者的疑惑,请各位赐教: 异常处理
  • telnet登录时,普通用户可以登录成功,但用root用户为什么登录不上?Linux初学者,请高手赐教
  • 初学者的疑惑??前辈请不吝赐教!
  • 我是初学者,有几个问题,想请教各位高手,望不吝赐教
  • 初学Unix,不知道怎么用gcc编译C文件????------望赐教
  • 初学者对于超类和子类的简单问题,请高手赐教!
  • 初学ejb,小问题,请赐教。。。
  • 初学linux线程同步遇到的问题,请高手赐教:
  • 初学者的问题:如何构建最简单的jsp开发环境?望不吝赐教!
  • jsp初学问题,请各位高手不吝赐教。在线等待!一定给分!
  • 初学Unix,问:标准级函数,如fopen,fclose;系统级函数open,close,两者什么关系?(在一篇讲文件操作的文章中看到的)
  • 初学者问题:标准的sql里有处理日期的函数吗?
  • 初学者小问:read(file,buf,size)函数在读取文件时,file会不会自动增加?
  • 初学者的问题--关于构造函数
  • 初学:请教下linux编程时怎样方便查找函数原型和结构体的
  • APUE初学者:请问dup,dup2函数可以用来干什么?有什么好处?
  • 初学shell编程_通讯录程序_grep函数与sed函数
  • 初学者四个问题:开发环境,同步机制,查函数帮助,查数据结构
  • java中有没有这样的函数就是判断一个字符串里面是不是含有另外一个字符串!例如 abcdef 里面查找是不是含有de谢谢了~初学者
  • 初学者:一个函数参数的问题,请大家帮忙!
  • 一个函数构思问题,大家指教。谢谢,初学。
  • linux socket sendto( )函数问题,初学,大家指点!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 初学 java 的朋友来和我交朋友,我也是初学。我的 QQ 号是 33555085
  • 又一个初学者的困惑!如果您是个大虾,请你一定要进来看看,指点迷津!如果您也是个初学者,那么您也一定要进来,也许我们有一样的遭遇!
  • 初学者的问题我是linux初学者,我想问一下在windows里下载的大于1.44M文件如何转移到linux分区里?
  • 我是个初学者,希望指点明津
  • 初学者用什么工具好?JBUILDER?JDK?
  • 对于初学者应该看什么样的java书籍
  • 初学java应该看那些书?
  • 初学linux看哪本书好?
  • 初学java,该看那些书,请朋友们指教
  • 我是初学者,该用什么java的“编译器”????
  • 初学java什么书好?
  • 对于初学者应该看什么样的书
  • 初学者:不是问题的问题?
  • 初学者这样检验自己的学习效果呢?
  • 初学JAVA,用哪个软件来调试和编译程序?
  • 初学者的问题??在线等待。
  • 各位高手大家好,我是初学LINUX想请教几个问题
  • 初学者的疑问
  • 从初学Linux到内核开发
  • 初学java的话,从何入手呢?vj++,还是jbuilder?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3