免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ccf
打印 上一主题 下一主题

fork的一个例子,好像人家是讲得很详细了,我还是不明白 [复制链接]

论坛徽章:
0
131 [报告]
发表于 2009-05-26 17:48 |只看该作者
原帖由 fera 于 2008-8-28 15:31 发表
PID fork()
{
    //...
    将一个假系统级上下文层压到子进程的系统上下文栈,该上下文层包括能够让子进程识别自己的一些信息,并且当子进程获得处理器时从此处开始执行; // 就像进程被调度时保存的上下文。
  // 一旦被调度,将从假系统级上下文层开始执行,父子进程将共享下面的代码。
    if(IsParent())
    {
        procTable[aPid]->State = READY_TO_RUN; // 此时子进程才可能被调度。
        return aPid;
    }
    else
    {
        初始化u area的与分时相关的一些字段;
        return 0;
    }
}

In Linux 0.99.15, sys_call.S, there's an instruction after a sys call:
movl %eax,EAX(%esp)             # save the return value
And the sys_fork() returns the pid of newly created process. When the new process is scheduled, stack is restored and the pid is returned via eax.

That's why fork() returns twice: 1 in parent CONTEXT, indicating whether fork() succeeded or not; 1 in child CONTEXT, with pid returned.
if (IsParent()) mentioned above may just check eax on the stack to see if it's 0 or non-zero.

论坛徽章:
0
132 [报告]
发表于 2011-04-27 15:25 |只看该作者
学习了~~

论坛徽章:
0
133 [报告]
发表于 2011-07-23 23:38 |只看该作者
太精彩了!

论坛徽章:
0
134 [报告]
发表于 2012-02-26 04:09 |只看该作者
程序的执行上下文(execution context)

论坛徽章:
0
135 [报告]
发表于 2012-03-02 13:55 |只看该作者
#include <unistd.h>
main(){pid_t c=0;while(1){if((c = fork())==-1)break;}}

论坛徽章:
0
136 [报告]
发表于 2014-10-10 11:34 |只看该作者
说说我的理解:

1,子进程会继承父进程的所有资源,包括各种变量,缓冲区等等,这其中,变量的值除了那个pid之外,父和子都是一样的。

2,pid不是进程号,写这个pid出来是为了让用户控制两个进程,和进程自身没有半点关系(即pid这里起到一个标识作用),真正的进程号是需要通过系统调用getpid来返回的。

3,为何在父中的pid返回它儿子的进程号,这是有原因的,因为,父进程没法通过其他的系统调用返回它儿子的进程号,而儿子进程可以通过getppid返回它父亲的进程号。

4,fork后的两个进程的代码段是一样的(除非子进程exec另外的程序),重点是儿子进程从哪里开始执行这段代码,答案是从fork语句之后。(你想要是把代码从头到尾执行一篇,那不是陷入了无限死循环,儿子再参生儿子,再参生儿子。。)。 至于为何在没有加\n的情况下,儿子进程也会打印出“fork!”,这是因为:
前面说的,儿子继承了父亲的缓冲区总的数据,没有加\n的父进程,这时候的“fork"字段还在缓冲区中,这样就被儿子copy了,后来,儿子在它的输出缓冲区中放入了\n,
即"i am the child \n",这里的字符和前面的fork!一起存入了缓冲区,遇到\n后,就输出了 。
这造成一种错觉,好像是儿子也把fork语句之前的代码执行了,注意,没有。你可以验证,在儿子进程后来输出任何语句的情况下,它是不会输出前面的fork的(因为没有\n)

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP