用fork()和vfork()创建的进程各有何特点

本文介绍了Fork和Vfork两种进程创建方式的区别。Fork创建的子进程是父进程的完整副本,拥有独立的数据段和堆栈。而Vfork仅使用指针复制的方式共享资源,并确保子进程在父进程前运行,直至调用exec或exit。

Fork():单调用,双返回函数

1、在一个父进程基础上创建一个子进程或新进程。

通过拷贝当前进程创建一个子进程。

2、根据fork()的返回值确定执行父进程还是子进程代码!

理解:子进程是父进程的一个拷贝。具体说,子进程从父进程那得到了数据段和堆栈段,但不是与父进程共享而是单独分配内存。fork函数返回后,子进程和父进程都是从fork函数的下一条语句开始执行。
由于子进程与父进程的运行是无关的,父进程可先于子进程运行,子进程也可先于父进程运行。

 

Vfork():

1、 在一个父进程基础上创建一个子进程,但并不把父进程的映像全部复制到子进程中,而只是用复制指针的方法使它们实现资源共享。

2、为避免发生父子进程间数据操作冲突,vfork()保证子进程先于父进程被运行,在子进程调用execve()exit()后,父进程才有机会被调度运行!

3、vfork()创建的子进程虽然在名称上仍叫做进程,但实质上它是一个线程

理解:vfork创建新进程的主要目的在于用exec函数执行另外的程序,实际上,在没调用execexit之前子进程的运行中是与父进程共享数据段的。在vfork调用中,子进程先运行,父进程挂起,直到子进程调用execexit,在这以后,父子进程的执行顺序不再有限制。

 

两者区别:
 1
fork()用于创建一个新进程。由fork()创建的子进程是父进程的副本。即子进程获取父进程数据空间,堆和栈的副本。父子进程之间不共享这些存储空间的部分。而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec (exit)于是也就不会存放该地址空间。相反,在子进程调用execexit之前,它在父进程的空间进行。
 2
vfork保证子进程先运行,在调用execexit之前与父进程数据是共享的,在它调用execexit之后父进程才可能被调度运行。

 3vfork保证子进程先运行,在她调用execexit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值