【LINUX】进程创建,fork和vfork的区别

什么是进程?

我已经在很早一篇博客阐述过了,不了解的可以去看看。
链接:什么是进程

进程的创建

认识fork函数

fork():一个进程,是包括代码、数据和分配给进程的资源,fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就两个进程可以完全做相同的事,但如果初始化参数或者传入的变量不同,两个进程也可以做不同的事一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的进程中,只有少数值与原来发的进程的值不同,相当于克隆了一个自己。

#include <unistd.h>; 
#include <sys/types.h>;
main ()
{

     pid_t pid;

          pid=fork();

          if (pid < 0)

                  printf("error in fork!");

          else if (pid == 0)

                  printf("i am the child process, my process id is %dn",getpid());

          else

                  printf("i am the parent process, my process id is %dn",getpid());


}

结果:

[root@localhost c]# ./a.out 
i am the child process, my process id is 4286 
i am the parent process, my process id is 4285

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

由此可以看出由vfork()所创建的进程不是对父进程的一份拷贝,而是共享父进程的代码和数据段

区别

1、fork()用于创建一个新进程。由fork()创建的子进程是父进程的副本。即子进程获取父进程数据空间,堆和 栈的副本。父子进程之间不共享这些存储空间的部分。而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec (或exit)于是也就不会存放该地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间进行。
2、vfork()与fork()另一个区别就是:vfork保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或 exit之后父进程才可能被调度运行。
3、vfork和fork之间的还有一个区别是: vfork保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

相同

1、两者被调用一次,但是返回两次。两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。
注意:vork创建的子进程不能直接return返回,因为因为子进程会先执行,执行结束后return 会清理栈空间,而父进程从返回处执行代码会发现栈空间不存在,会出现栈错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值