Linux学习之"vfork函数"

为什么使用vfork()?

希望父子进程执行不同的代码。例如:

网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork,使子进程处理该次请求,而父进程继续等待下一个服务请求到达。
vfork与fork的函数原型相同,用于创建新进程,而该新进程的目的是exec一个新程序(执行一个可执行的文件)。
由于新程序将有自己的地址空间,因此vfork函数并不将父进程的地址空间完全复制到子进程中
注意以下两点:
1.子进程在调用exec或exit之前在父进程的地址空间中运行
2.vfork函数保证子进程先执行,在它调用exec或者exit之后,父进程才可能被调度执行
View Code
#include<iostream>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

using namespace std;

int glob = 6;

int main(void)
{
int var;
pid_t pid;

var = 88;

printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);

printf("before fork\n");

if ( (pid = vfork()) < 0)
{
cout << "fork error" << endl;
return 0;
}
else if (pid == 0)
{
glob++;
var++;
printf("In Child\n");

_exit(0);
}

printf("In Parents\n");
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);

return 0;
}
因为在_exit(0);之前子进程运行在父进程的地址空间中,所以对glob和var的++操作都最终在父进程中输出了。
至于最后为什么使用_exit而不是exit,见"Linux学习之"exit函数""
posted @ 2011-10-24 14:57  lq0729  阅读(696)  评论(0编辑  收藏  举报