fork和vfork区别
来源:互联网 发布:南方电网 知乎 编辑:程序博客网 时间:2024/04/29 09:18
fork和vfork都是创建一个子进程,但是是有区别的,主要区别有两点:
(1)fork创建的子进程拷贝父进程的进程空间,包括代码段、数据段(data,bss),堆栈段;而vfork创建的子进程不会拷贝父进程的进程地址空间,直到子进程调用exec族函数才进行进程空间拷贝。
(2)fork创建子进程后,子进程和父进程同时运行下文的代码,而vfork创建的子进程会阻塞父进程,子进程继续运行
直到调用exit(),_exit()和exec族函数,父进程从能继续运行。
为什么要使用vfork?,vfork可以在创建子进程时,将资源占用降到最低,vfork创建的进程是轻量级的进程,相当于线程。vfork如果执行修改变量的代码,父进程中的变量也会相应改变,因此父进程会阻塞,直到子进程退出或者开启新的程序执行空间(调用exec族函数),避免对内存边界区的访问冲突。
有一点需要注意,在vfork创建的子进程中调用return会造成不可预期的后果,如下代码所示:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>int global = 1;int main(){ int var; pid_t pid; var = 14; printf("begin vfork\n"); if ((pid = vfork()) < 0) { printf("vfork error"); exit(-1); } else if (pid == 0) { /* 子进程 */ global++; var++; return 0; //exit(0); } printf("pid=%d, global=%d, var=%d\n", getpid(), global, var); return 0; //exit(0);}该段代码的运行结果:
begin vforkpid=5101, global=31853, var=15begin vforkpid=5101, global=31854, var=15begin vforkpid=5101, global=31855, var=15begin vfork
所以在vfork的子进程退出时要使用exit,而不是return;
虽然return和exit在main函数中效果是一样的。
0 0
- 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()、COW和vfork()的区别
- fork与vfork的使用和区别
- Linux-fork(),vfork()和clone的区别
- fork vfork函数区别
- vfork,fork,exec区别
- fork vfork函数区别
- nyoj 130相同的雪花
- cs真人游戏后畅想
- Gradle failed: already disposed module: XXX
- 性能测试流程-各阶段的工作
- 位操作实现技巧
- fork和vfork区别
- MYSQL导入过大文件时的解决办法
- MFC绘图控制-映射模式
- 统计在从1到n的正整数中1出现的次数
- A+B for Input-Output Practice (VIII)
- Android 开发之Preference
- C语言可执行文件形成的过程
- 黑马程序员——IO流-字节流、字符流
- 迷宫问题(深搜)