函数fork与vfork的区别与联系详解

 创建一个新进程的方法只有由某个已存在的进程调用 fork() vfork() ,当然某些进程如 init 等是作为系统启动的一部 而被内核创建的。
1.fork函数介绍
#include <sys/types.h>
#include <unistd.h>
pid_t fork (void );
正确返回:父进程中返回子进程的进程号;子进程中返回0 ;(单调用双返回函数)
错误返回:-1
子进程是父进程的一个拷贝。具体说,子进程从父进程那得到了数据段和堆栈段 ,但不是与父进程共享而是单独分配内存。fork 函数返回后,子进程和父进程都是从 fork 函数的下一条语句开始执行。
由于子进程与父进程的运行是无关的,父进程可先于子进程运行,子进程也可先于父进程运行,所以下段程序可以有两种运行结果。
[root@happy src]# cat simplefork.c
#include  < stdio.h>
#include  < sys/types.h>
#include  < unistd.h>
int globa = 4;
int main (void )
{
        pid_t pid;
        int vari = 5;
        printf ("before fork/n" );
        if ((pid = fork())  0){
                printf ("fork error/n");
                exit (0);
        }
        else if (pid == 0){ 
                globa++ ;
                vari--;
                printf("Child changed/n");
        }
        else
                printf("Parent did not changde/n");
        printf("globa = %d vari = %d/n",globa,vari);
        exit(0);
}
运行结果:(可能出现的一种结果)
[root@happy src]# ./a.out
before fork
Child changed
globa = 5 vari = 4
Parent did not changde
globa = 4 vari = 5
2.vfork函数介绍
vfork创建新进程的主要目的在于用 exec 函数执行另外的程序 ,实际上,在没调用exec exit 之前子进程的运行中是与父进程共享数据段的。在 vfork 调用中,子进程先运行,父进程挂起,直到子进程调用 exec exit ,在这以后,父子进程的执行顺序不再有限制。
[root@happy src]# cat simplevfork.c
#include  < stdio.h>
#include  < sys/types.h>
#include  < unistd.h>
int globa = 4;
int main (void )
{
        pid_t pid;
        int vari = 5;
        if ((pid = vfork())  <  0){
                printf ("fork error/n");
                exit (0);
        }
        else if (pid == 0){
                globa++ ;
                vari--;
                printf("Child changed/n");
                _exit(0);
        }
        else
                printf("Parent did not changde/n");
        printf("globa = %d vari = %d/n",globa,vari);
        exit(0);
}
运行结果(固定的):
[root@happy src]# gcc simplevfork.c
[root@happy src]# ./a.out
Child changed
Parent did not changde
globa = 5 vari = 4
总结
区别:
    1 fork() 用于创建一个新进程。由 fork() 创建的子进程是父进程的副本。即子进程获取父进程数据空间,堆和 栈的副本。父子进程之间不共享这些存储空间的部分。而 vfork() 创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用 exec ( exit) 于是也就不会存放该地址空间。相反,在子进程调用 exec exit 之前,它在父进程的空间进行。
    2 vfork() fork() 另一个区别就是: vfork 保证子进程先运行,在调用 exec exit 之前与父进程数据是共享的 , 在它调用 exec exit 之后父进程才可能被调度运行。
    3/vfork fork 之间的还有一个区别是:  vfork 保证子进程先运行,在她调用 exec exit 之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
相同:
1、两者被调用一次,但是返回两次。两次返回的唯一区别是子进程的返回值是 0 ,而父进程的返回值则是新子进程的进程 ID

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值