fork()与vfork()函数

fork()与vfork()函数

1 fork()函数

       创建一个和当前进程映像一样的进程。

#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);

       失败返回-1;成功返回:父进程返回子进程的进程ID(非负);子进程返回0。

       fork会产生一个和父进程完全相同的子进程。Linux中引入了“写时复制”技术,只有进程空间的各段的内容要发生变化时,才会将进程的内容复制一份给子进程。

       在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。

2 父进程fork()后父子进程共享的内容

       fork之后,子进程会拷贝父进程的数据空间、堆和栈空间(实际上是采用写时复制技术),二者共享代码段。所以在子进程中修改全局变量(局部变量,分配在堆上的内存同样也是)后,父进程的相同的全局变量不会改变。

       父子相同之处:全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式….

       父子不同之处:进程ID、fork返回值、父进程ID、进程运行时间、闹钟、未决信号集

       父子进程共享:1.文件描述符(打开文件的结构体)2.mmap建立的映射区。

       不同进程打开同一个文件,进程表和文件表的关系如下图所示:

 

进程所打开文件和在fork后的结构图如下所示,子进程是共享父进程的文件表项。

 

3 fork()的原理

       fork()-->clone()-->do_fork()-->copy_process()

       fork()调用clone(),clone()调用do_fork(),do_fork()调用copy_process(),子进程会拷贝父进程的内核栈,thread_info,task_struct,打开的文件描述符等。它采用的是copy_on_write机制,即拷贝的只是父进程的虚拟空间但指向同一个物理内存。只有在更改段的情况下才会真正的复制物理内存。

4 vfork()函数

      

#incldue <sys/types.h>
#include <unistd.h>
pid_t vfork(void);

       vfork()用于创建一个新进程,而新进程的目的是exec一个新程序。vfork()会挂起父进程直到子进程终止或者运行了一个新的可执行文件的映像。vfork()和fork()一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec或exit,于是也就不会存放改地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间中运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

5 vfork()和fork()之间的区别:

  1. vfork()保证子进程先运行,在调用exec或者exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行;fork()创建子进程后会复制父进程的虚拟空间,但物理内存都是指向同一个,它是两个同时运行的。
  2. 如果在调用exec或exit之前子进程依赖于父进程的进一步动作,则会导致死锁。
  3. fork()的父子进程执行次序不确定;vfork()保证子进程先运行,在调用exec或者exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值