调用方法和返回值与fork一样
vfork - create a child process and block parent
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);
vfork和fork的semantics不同
- 和
fork一样创建新的进程, 但child不引用的地址空间,不会复制到child中去
;child简单的在vfork之后调用exec or exit。换句话说,在执行exec或者exit之前,child运行在parent的地址空间。 vfork保证child首先执行,直到child调用exec或者exit。调用之后,恢复parent的执行。
Example:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int glob = 6;
int main(void)
{
int var;
pid_t pid;
var = 88;
printf("before fork\n");
if((pid = vfork()) < 0)
{
fprintf(stderr, "fork error!\n");
exit(-1);
}else if(pid == 0)//子进程
{
var++;
glob++;
printf("I'm child\n");
sleep(1);
_exit(0);
}
else//父进程
{
printf("I'm parent\n");
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}
运行后我们会发现在child调用_exit(0)之前,parent进程处于阻塞状态
我们这里使用_exit(0)是直接返回内核,如果调用exit刷新了标准IO缓冲区,具体结果取决于实现。
调用exit(0)可能会关闭标准IO流,因为child和parent共享地址空间。
如今,大多数现代的
exit的实现不用担心关闭stream的问题。因为进程将要关闭,kernel将会关闭所有打开的文件描述符。简单的增加在库中关闭的操作没有什么好处。
本文详细介绍了vfork函数的调用方法及与fork的区别。vfork创建新进程时,子进程不复制父进程的地址空间,而是在调用exec或exit前运行在父进程中。文章通过示例展示了vfork如何确保子进程先执行,并解释了为什么父进程在此期间被阻塞。
472

被折叠的 条评论
为什么被折叠?



