vfork()的体会

来源:互联网 发布:和珅 王刚 知乎 编辑:程序博客网 时间:2024/05/17 22:24

#include <stdio.h>
#include <unistd.h>

int f1()
{
    printf( "<----f1---->/n" );
    vfork();
    printf( "<---->f1<---->/n" );
    return 0;
}
int f2(int a,int b)
{
    printf( "<----f2---->/n" );
    return a+b;
    //return 0;
}

int main()
{
    int c;
   
    f1();
    printf( "<-------------dddddddddd------------>/n" );
    c = f2(1,2);
    printf( "<--------------fffffffffffff----------->/n" );
    printf("%d/n",c);
    printf( "<----------------gggggggggggg--------->/n" );
    sleep(3);
    return 0;
}

 

运行结果

<----f1---->
<---->f1<---->
<-------------dddddddddd------------>
<----f2---->
<--------------fffffffffffff----------->
0
<----------------gggggggggggg--------->
<---->f1<---->
段错误

 


体会:

据我分析:f1()函数中用vfork()创建了一个子进程,该进程与f1()共享地址空间,包括代码段,数据段,堆栈段。由于vfork()创建的子进程执行完后才继续执行父进程,并且子进程与父进程共享代码,所以子进程执行

    printf( "<-------------dddddddddd------------>/n" );
    c = f2(1,2);
    printf( "<--------------fffffffffffff----------->/n" );
    printf("%d/n",c);
    printf( "<----------------gggggggggggg--------->/n" );
    sleep(3);
    return 0;

最后一句代码由于有“return 0;”,意味着子进程结束。由于子进程和父进程共享代码段,所以父进程也“return 0”。导致子进程和父进程冲突(其中具体情况我也不了解,只是凭个人推测)。


以上观点纯属个人体会,可能有不对的地方,哪位高手如果对此非常熟悉,还请指教!不胜感激!

原创粉丝点击