您的位置:首页 > 其它

fork与vfork 的研究

2016-07-19 23:02 183 查看
fork:

pid_t fork(void)函数可用于创建子进程

一个现有进程可以调用fork创建一个新进程

返回值:子进程返回0,父进程返回子进程ID,出错返回-1

子进程是父进程的副本,例如:子进程获得父进程数据空间,堆和栈的副本(主要是数据结构的副本)。父子进程不共享这些存储空间部分,父子进程不共享这些存储空间部分。父子进程共享正文段。由于fork之后经常归属exec,所以现在很多实现并不执行一个父进程数据段,栈和堆的完全复制,作为替代,使用了写时拷贝计数,这些区域由父子进程共享,而且内核将他们的访问权限改为只读的。如果父子进程中的人一个试图修改这些区域,则内核只为修改的那块内存制作一个副本。



vfork:

vfork函数的调用序列和返回值与fork相同。但两者的语义不同。

vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。vfork与fork都创建一 个子进程,但它不将父进程的地址空间复制到子进程中,因为子进程会立即调用 exec,于是不会存访问该地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。vfork和fork另一区别在于 :vfork保证子进程先运行,在它调用exec或(exit)之后父进程才可能被调度运行。
<span style="font-size:24px;">#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>

int g_val = 0;

void fun()
{
printf("child exit\n");
}

int main()
{
int val = 0;
pid_t id = vfork();
if(id < 0)
{
exit(1);
}
else if(id == 0) //child
{
atexit(fun);
printf("this is child process.\n");
++g_val;
++val;
sleep(3);
exit(0);
}
else
{
printf("this is father process\n");
printf("father exit, g_val = %d, val = %d\n", g_val, val);
}
return 0;
}  </span>




子进程直接改变了父进程的变量值,因为子进程在父进程的地址空间中运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: