Linux下fork()与vfork()及其之间的差异

       我们知道fork与vfork函数的作用是都能创建一个新进程,那他们有什么区别呢!本文重点介绍fork与vfork函数及它们之间的差异。

|fork

函数原型:pid_t fork(void);//pid_t为无符号整型

函数功能:creates  a new process by duplicating the calling process.//一个现有进程调用fork创建一个新进程

参数:无

返回值:①成功:子进程返回0;父进程返回子进程的ID。(fork特性,调用一次,有两个返回值)

             ②失败:返回-1。

将子进程ID返回给父进程的理由是:一个进程的子进程可以有多个,但没有一个函数可以使得父进程获得其所有子进程的进程ID;

子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid获得其父进程的进程ID(注意的是,进程ID为0的进程由内核交换进程使用,因此,子进程的ID不可能为0);

fork失败的原因:①系统中有太多的进程;

                          ②实际用户的进程数超过了限制

我们先看第一个例子:


查看运行结果:


这段代码显示了fork前后的执行过程,如图


      子进程是父进程的副本,它从父进程处继承了整个进程的地址空间包括进程上下文(进程执行活动全过程的静态描述)进程堆栈、打开的文件描述符、信号控制设定、进程优先级、进程组号等。子进程独有的只有它的进程号,计时器等(只有小量信息)。父进程和子进程并不共享存储空间部分,而是共享正文段。

    实际而言,Linux 的 fork() 使用是通过写时拷贝 (copy- on-write) 实现。写时拷贝是一种可以推迟甚至避免拷贝数据的技术。内核此时并不复制整个进程的地址空间,而是让父子进程共享同一个地址空间,而且内核将他们的访问权限改变为只读。只在需要写入的时候才会复制地址空间,从而使各个进行拥有各自的地址空间。


fork的常规用法:

①一个父进程希望复制自己,使父子运行不同的代码段;

②一个进程要执行不同的程序;

我们可以根据fork的特性,它的两个返回值不同,实现多任务要求:

第二个例子:

看一下运行结果:


通过运行结果,可以看到,父子进程各自打印一句话。这里,我们只是看到只有一份代码,实际上,fork()以后有两个地址空间在独立运行

验证父子进程各自的地址空间是独立的

查看运行结果:


由运行结果我们可以看到,子进程对改变量的改变并不影响父进程中变量的值。


|vfork

函数原型:pid_t vfork(void);

其它的都与fork相同,区别在于:①vfork用来创建一个子进程,但子进程和父进程共享地址空间;

                                                ②vfork保证子进程先运行,在它调用exec或exit之后,父进程才可能被调度运行;

看一个例子:


看一下运行结果:


我们发现,子进程改变变量值后父进程也会改变。

如果子进程没有调用exec或exit函数,则会造成死锁。

例:


看运行结果:


父子代码里并没有循环,运行结果却显示父子进程交替执行。

       因此,以后在使用vfork是一定要注意!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值