描述
fork和vfork有什么区别,作为嵌入式工程师,这个肯定是要掌握的。
不管是fork还是vfork,他们都是为了创建子进程。
函数原型一样,没有参数,但是返回值比较奇怪,别的函数都是只有一个返回值,但是fork和vfork有两个。
#include
#include
int main()
{
pid_t pid = fork();
if (-1 == pid)
{
perror("fork");
exit(-1);
}
else if (0 == pid)
{
printf("this is child ...
");
}
else
{
printf("this is parent ...
");
}
return 0;
}
就拿fork来说,程序刚运行的时候,只有一个父进程在运行,执行了fork系统调用后,多了一个子进程,你可以理解成有两个人在执行这段代码,父进程的fork返回子进程的ID,子进程的fork返回0,所以代码运行的现象就是fork存在两个返回值,if语句会进入两个分支。
fork和vfork的最大区别就是:fork产生的子进程会复制父进程的地址空间,在内核的进程表中创建一个新的进程表项,新的进程表项有很多属性和原进程一样,像堆栈、数据段、文件描述符这些都会直接从父进程中继承过来,而且两个进程的代码也一样。
要说不一样的地方,比如进程号、父进程号肯定不一样。
那vfork有什么使用场景,如果fork产生子进程后,子进程立马调用exec函数族启动了一个新的进程,那么fork产生的地址空间必将浪费。
于是就有了vfork函数,它最大的特点就是父子进程共享同一块地址空间,这样也不用给子进程分配资源,因为子进程接下来会被一个全新的进程替换。
除了共享资源上的区别,还有一些,比如fork产生的子进程和父进程的运行顺序不一定,由系统决定,但是vfork产生的子进程一定比父进程先运行。
最后,再来看一下vfork的man手册。

它提到了有些人认为vfork是一种架构缺陷,因为fork有了写时拷贝机制,所以在有些场景下使用fork再去通过exec启动新的进程也没问题。
审核编辑:刘清
打开APP阅读更多精彩内容
全部0条评论
快来发表一下你的评论吧 !