fork与vfork的区别函数
1.fork函数介绍spa
#include sys/types.h>
#include unistd.h>
pid_t fork (void );
正确返回:父进程中返回子进程的进程号;子进程中返回0;(单调用双返回函数)
错误返回:-1;
子进程是父进程的一个拷贝。具体说,子进程从父进程那获得了数据段和堆栈段,但不是与父进程共享而是单独分配内存。fork函数返回后,子进程和父进程都是从fork函数的下一条语句开始执行。因为子进程与父进程的运行是无关的,父进程可先于子进程运行,子进程也可先于父进程运行,因此下段程序能够有两种运行结果。进程
#include stdio.h>
#include sys/types.h>
#include unistd.h>
int globa = 4;
int main (void )
{
pid_t pid;
int vari = 5;
printf ("before fork\n" );
if ((pid = fork()) 0){
printf ("fork error\n");
exit (0);
}
else if (pid == 0){
globa++ ;
vari--;
printf("Child changed\n");
}
else
printf("Parent did not changde\n");
printf("globa = %d vari = %d\n",globa,vari);
exit(0);
}内存
运行结果:(可能出现的一种结果)
before fork
Child changed
globa = 5 vari = 4
Parent did not changde
globa = 4 vari = 5
it
2.vfork函数介绍
vfork建立新进程的主要目的在于用exec函数执行另外的程序,实际上,在没调用exec或exit以前子进程的运行中是与父进程共享数据段的。在vfork调用中,子进程先运行,父进程挂起,直到子进程调用exec或exit,在这之后,父子进程的执行顺序再也不有限制。
#include stdio.h>
#include sys/types.h>
#include unistd.h>
int globa = 4;
int main (void )
{
pid_t pid;
int vari = 5;
if ((pid = vfork()) 0){
printf ("fork error\n");
exit (0);
}
else if (pid == 0){
globa++ ;
vari--;
printf("Child changed\n");
_exit(0);
}
else
printf("Parent did not changde\n");
printf("globa = %d vari = %d\n",globa,vari);
exit(0);
}
运行结果(固定的):
Child changed
Parent did not changde
globa = 5 vari = 4
io
区别:
一、fork()用于建立一个新进程。由fork()建立的子进程是父进程的副本。即子进程获取父进程数据空间,堆和 栈的副本。父子进程之间不共享这些存储空间的部分。而vfork()建立的进程并不将父进程的地址空间彻底复制到子进程中,由于子进程会当即调用exec (或exit)因而也就不会存放该地址空间。相反,在子进程调用exec或exit以前,它在父进程的空间进行。
二、vfork()与fork()另外一个区别就是:vfork保证子进程先运行,在调用exec或exit以前与父进程数据是共享的,在它调用exec或exit以后父进程才可能被调度运行。
三、vfork和fork之间的还有一个区别是: vfork保证子进程先运行,在她调用exec或exit以后父进程才可能被调度运行。若是在调用这两个函数以前子进程依赖于父进程的进一步动做,则会致使死锁。
程序
相同:二者被调用一次,可是返回两次。两次返回的惟一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。error