fork and vfork的区别

在Unix下可以调用fork 或者vfork来新建一个process。 那么他们有什么区别和联系呢?

1   使用fork调用会为子进程复制父进程所拥有的资源(进程环境,
内存,堆,栈等)。而使用vfork新建的子进程则是和父进程共享所有的资源 ,在子进程中对数据的修改也就是对父进程数据的修改,这里一定要注意。
2   使用fork系统调用产生父子进程,在默认情况下不加与人为干预,父子进程的执行循序是由OS调度的(也就是说他们两个执行顺序不确定);而对于vfork所生成的父子进程,父进程是在子进程调用了_exit() 或者exe()后才会继续执行。不调用这两个函数则会出错。

总结:从上面可以看处 使用Vfork可以避免资源的浪费 但是也带了资源共享所产生的问题。

PS:在linux中 ,对fork的调用采用了copy on write(COW:写时复制的方式)的方式: 在系统调用fork生成子进程的时候,不马上为子进程复制父进程的资源,而是在遇到“写入”(对资源进行修改)操作时才复制资源。

示例:fork.c

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

int global;

int main()
{
 pid_t pid;
 int stack = 1;
 int * heap;
 
 heap = (int *)malloc(sizeof(int));
 *heap = 2;
 
 pid = fork();
 
 if(pid < 0){
  printf("fail to fork/n");
  exit(1); 
 }else if(pid == 0){
  global++;
  stack++;
  (*heap)++;
  
  printf("the child, data : %d, stack : %d, heap : %d/n", global, stack, *heap);
  exit(0);
 }
 
 sleep(2);

 printf("the parent, data : %d, stack : %d, heap : %d/n", global, stack, *heap);
 
 return 0;
}

[root@localhost yuan]# ./fork
the child, data : 1, stack : 2, heap : 3

the parent, data : 0, stack : 1, heap : 2
[root@localhost yuan]#

示例:vfork.c

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

int global;

int main(void)
{
 pid_t pid;
 int stack = 1;
 int * heap;
 
 heap = (int *)malloc(sizeof(int));
 *heap = 2;

 pid = vfork();

 if(pid < 0){
  printf("fail to fork/n");
  exit(1); 
 }else if(pid == 0){
  global++;
  stack++;
  (*heap)++;

  printf("data : %d, stack : %d, heap : %d/n", global, stack, *heap);
  printf("child terminates/n");

  exit(0); 
 }
 
 /* sleep(2); */

 printf("data : %d, stack : %d, heap : %d/n", global, stack, *heap);
 printf("parent terminates/n");
 
 return 0;
}


[root@localhost yuan]# gcc -o vfork vfork.c
[root@localhost yuan]# ./vfork
data : 1, stack : 2, heap : 3
child terminates
data : 1, stack : 2, heap : 3
parent terminates

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值