fork and vfork的区别
来源:互联网 发布:单片机cjne 编辑:程序博客网 时间:2024/06/02 23:16
在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 parent, data : 0, stack : 1, heap : 2
the child, data : 1, stack : 2, heap : 3
[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
- fork and vfork的区别
- fork, vfork的区别
- fork和vfork的区别
- fork和vfork的区别
- fork与vfork的区别
- fork与vfork的区别
- fork 与 vfork 的区别
- fork与vfork的区别
- vfork和fork的区别
- fork和vfork的区别
- fork()与vfork()的区别
- fork与vfork的区别
- fork与vfork的区别
- fork() 和 vfork 的区别?
- fork与vfork的区别
- fork与vfork的区别
- fork与vfork的区别
- fork和vfork的区别
- [转]C/C++预处理指令#pragma详解
- 启动和关闭数据库的归档(archived)模式
- Oracle OS认证与口令文件认证详解
- 脚本解释器构架(一)
- visual studio 20008调试sqlserver 2005 触发器
- fork and vfork的区别
- linux下svn命令大全
- 浅谈ARM裸板调试
- Windows下用sftp巧妙打造安全传输
- Oracle的Archive Log模式下的恢复工作
- HTTP协议详细介绍
- 文件操作函数总结
- package 和 import
- linux下svn命令大全