fork与vfork浅析

在Unix编程时,学习到了进程的建立的函数fork()与vfork()这两个函数,所以做了一个总结:

1.fork()函数

      创建子进程,创建的子进程与父进程共享代码段,但不共享数据段;在调用fork()函数后父子进程的运行顺序不定,一个运行另个阻塞。其返回值有3种:

    a.创建出错返回-1;

    b.创建正确,在子进程中返回0;在父进程中返回该子进程的PID。

代码如下所示:

        

运行结果如下:

             

由程序和运行结果可得出如下结论:

    a.由上图蓝框可知,打印的顺序不定,即在调用fork()函数后父子进程的运行顺序不定;

    b.由a的值(红线部分)可知,父子进程共享代码段,但并没有共享数据段;

   c..由上图黄色部分可知,在父进程中pid=fork()函数返回值为子进程的PID,而子进程中的pid值为0;

    d.细心的话,可发现子进程的PID一直大于父进程的PID,原因是什么呢,原因在与在调用fork()函数之前父进程   的PID已经存在,即父进程先于子进程创建,因此PID小于子进程。

2. vfork()函数

      个人认为vfork()这个函数比较难理解。vfork()函数也是创建子进程,其主要目的是在于用exec函数执行另外的程序,在调用exec或exit之前子进程的运行中是与父进程共享数据段,但如果子进程修改了数据,而又没有调用exec或exit,其结果是很糟糕的例如下面的代码:  

           

其运行结果如下:

          

由程序和运行结果可得出如下结论:

    a. 由绿色的方框可知,子进程与父进程是即共享代码段也共享数据段的

    b. 由红色的圆框可知,在vfork()函数调用后,是先运行子进程后运行父进程

    c. 由蓝色的线可知,vfork()函数返回的值,子进程为0,父进程为子进程的PID

倘若去掉子进程中的exit(0)(程序14行),会是什么样的一个结果呢?如下:

          


由程序和运行结果可得出如下结论:(程序一直运行直到子进程pid溢出才停止,即vfork()返回值pid=-1)

    a. 由蓝线可知vfork()函数返回的值,子进程为0,父进程为子进程的PID

    b. 由红框可知,在改程序运行时,由于整个进程一直在运行所以父进程的PID保持不变。

    c. 由紫色框可知,a的值无论在父进程还是子进程,其值都是不变的,

    d. 现在解释一下,为什么程序最后vfork()函数会返回-1,其实是这个过程中是不断的创建子进程的,所以子进程的pid一直在变化,直到所有的pid被用完,才停止程序,是不是很有意思呢。



猜你喜欢

转载自blog.csdn.net/hubbybob1/article/details/41751129