Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20597
  • 博文数量: 5
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-18 11:51
文章分类

全部博文(5)

文章存档

2011年(1)

2008年(4)

我的朋友
最近访客

分类: C/C++

2008-07-23 22:00:18

这是一段自己测试fork()和vfork()的代码,代码不长,有一些疑问向高手请教
#include
#include
#include
#include
int main()
{
       pid_t pid;
        int i;
        int j=0;
        pid_t pid0;
        pid0=getpid();
        printf("now_id=%d\nnow_id=%d\n",pid0,getpid());
        for(i=0;i<2;i++)
        {
                if((pid=fork())<0)/*此处第一个程序用fork(),第二个程序用vfork()*/
                {
                       printf("fork error !\n");
                    exit(1);
                }
                else if (pid==0)
                {
                    printf("child process is printing.\nreturn_id=%d\n",pid);/*返回0*/
                    printf("j=%d\n",j++);
                    printf("now_id=%d\n",getpid());/*输出当前进程ID*/
                }
                else
                {
                        printf("parent process is printing.\nreturn_id=%d\n",pid);/*返回子进程ID*/
                        printf("pj=%d\n",j++);
                        printf("now_id=%d\n",getpid());
                }
        }
        exit(0);
}

运行结果:
第一个程序,fork():

zhangxiong@zhangxiong-desktop:~/c_code$ ./a.out
now_id=6411
now_id=6411
child process is printing.
return_id=0
j=0
now_id=6412
child process is printing.
return_id=0
j=1
now_id=6413
parent process is printing.
return_id=6412
pj=0
now_id=6411
parent process is printing.
return_id=6413
pj=1
now_id=6412
child process is printing.
return_id=0
j=1
now_id=6414
parent process is printing.
return_id=6414
pj=1
now_id=6411

第二个程序,vfork():

zhangxiong@zhangxiong-desktop:~/c_code$ ./a.out
now_id=6396
now_id=6396
child process is printing.
return_id=0
j=0
now_id=6397child
child process is printing.
return_id=0
j=1
now_id=6398
parent process is printing.
return_id=6398
pj=2
now_id=6397
parent process is printing.
return_id=6397
pj=3
now_id=6396

疑问:
1、对于第一个程序使用fork()产生的运行结果有些不理解,j的数值的变化为(0,1),而第二个程序使用vfork(),j的数值的变化为(0,1,2,3),是因为这个原因么(“fork()同父进程使用不同的数据段,vfork()和父进程共享数据段”),所以第一个程序中父子进程中相同的变量名j却是代表了不同的变量,在内存中有不同的内存空间,是不是这样呢,对这句话理解的不是十分清楚,不知道这是怎样一个过程,请教,请教;

2,第一个程序执行了2次fork(自己的理解,如果错了还请包涵,呵呵),却弄出了三个子进程,6411有两个(6412,6414)子进程,这是怎么回事呢?最后这个6414是怎么产生的呢?

3、书上说“调用fork()时,系统将创建一个与当前进程相同的新的子进程,但是同父进程使用不同的数据段和堆栈段,属性有稍微差异”,请教高手解释一下“使用不同的数据段和堆栈”,并能详细描述一下此程序的运行过程;

4、对于第一个程序,如果增加循环的次数,会有更复杂的情况出现,比如当循环的控制条件为(i<3)时,有一段混乱的输出:
    child process is printing.
    parent process is printing.
    return_id=0
    j=1
    now_id=6481
    return_id=6480
    pj=2
    now_id=6477
  子进程和父进程交互着输出,怎么回事呢?

5、第一个程序fork(),似乎有一个规律:
循环控制条件,“->”符号意义(父进程-(产生)->子进程)
(i<2):6411->6412->6413
              6411->6414
(i<3):6476->6477->6478->6479
                            6477->6480
              6476->6481->6482
              6476->6483
执行两此循环第一个父进程有两个子进程,第一个子进程有子进程,第二个子进程没子进程;
执行三次循环第一个父进程有三个儿子,其中大儿子有两个儿子(这兄弟俩老大有一个儿子,老二没儿子),二儿子有一个有儿子的儿子,三儿子没儿子;(为了方便描述和理解,所以这么说,见谅,见谅)
这是一个什么样的规律呢,又是怎样运行出来的呢?

6、向高手请教,非常感谢!





阅读(1427) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:关于函数的返回方式的疑问

给主人留下些什么吧!~~

chinaunix网友2008-09-22 15:14:10

1.个人感觉就是因为共享数据段的原因。 2.第一个程序实际上调用了3次fork(),分别发生在: *进程6411,i=0时,生出子进程6412; *进程6412,i=1时,生出子进程6413; *进程6411,i=1时,生出子进程6414; 3.个人感觉是这样的:fork()把父进程的所有相关数据(包括代码,数据,堆栈等等)做了一份拷贝,用来生成子进程。然后子进程就顺着当时的指令指针所指的位置继续运行,只不过它已经使用自己的那套数据,和父进程可以说不再有交互关系了(除了最后返回)。 4.分时系统上,进程随时有可能被系统中断执行的吧…… 5.我觉得是这样的:因为每个子进程有自己的独立的i的拷贝,具体如下 (i<2):6411(i=0)->6412(i=1)->6413(i=2) 6411(i=1)->6414(i=2) (i<3):6476(i=0)->6477(i=1)->6478(i=2)->6479(i=3) 6477(i=2)->6480(i=3)