linux下系统调用之fork()和vfork()探索

原创 2013年12月04日 15:35:06
fork函数和vfork()都可以用来创建进程
fork()一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
vfork()会产生一个新的子进程.但是vfork创建的子进程与父进程共享数据段(参考百度文库,其实还共享了堆,运行结果表明),而且由vfork创建的子进程将先于父进程运行
示例一:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    pid_t pid;
      int  _num=8; 
    if ((pid = vfork()) < 0) {  //创建子进程失败
        perror("vfork is failed");
        exit(1);
    } else if (pid == 0) {  //运行时子进程
        printf("this is child process\n");
        _num++;
        printf("the num is :%d\n",_num);
        exit(0);
    } else {  //  >0 vfork()返回值是子进程pid
        printf("this is parent process\n");
        _num++;
        printf("the num is :%d\n",_num);
      }   
    return 0;
}


运行结果:




第二个示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    pid_t pid;
      int  _num=8; 
    if ((pid = fork()) < 0) {
        perror("fork is failed");
        exit(1);
    } else if (pid == 0) {
        printf("this is child process\n");
        _num++;
        printf("the num is :%d\n",_num);
        exit(0);
    } else {
        printf("this is parent process\n");
        _num++;
        printf("the num is :%d\n",_num);
      }   
    return 0;
}
 运行结果:




版权声明:本文为博主原创文章,转载请注明出处 http://blog.csdn.net/buyingfei8888

linux——浅谈fork与vfork的使用与区别

区别:1.fork:子进程拷贝父进程的数据段 vfork:子进程与父进程共享数据段 2.fork:父,子进程的执行次序不确定 vfork:子进程先运行,父进程后运行...
  • xiaowu8858892520
  • xiaowu8858892520
  • 2016年12月11日 19:11
  • 544

函数fork与vfork的区别与联系详解

创建一个新进程的方法只有由某个已存在的进程调用fork()或vfork(),当然某些进程如init等是作为系统启动的一部风而被内核创建的。 1.fork函数介绍 #include sys/type...
  • midion9
  • midion9
  • 2016年01月15日 15:39
  • 857

Linux中fork,vfork和clone详解(区别与联系)

fork,vfork,cloneUnix标准的复制进程的系统调用时fork(即分叉),但是Linux,BSD等操作系统并不止实现这一个,确切的说linux实现了三个,fork,vfork,clone(...
  • gatieme
  • gatieme
  • 2016年05月15日 16:09
  • 15926

fork 和 vfork 使用的注意事项和 system() 函数的替代

在Linux编程中,我们经常使用 Fork()。然而不少情况下,fork是有危险的。但是又不能简单使用vfork替换就成了。这个笔记说明了两者使用的一些注意点。 本文地址:https://segmen...
  • qq_28086637
  • qq_28086637
  • 2016年08月22日 16:47
  • 468

uc笔记07---进程管理,PID,#ps,getxxxid,fork,vfork,system

1.    进程与程序     1) 进程就是运行中的程序。一个运行着的程序,     可能有多个进程。进程在操作系统中执行特定的任务。     2) 程序是存储在磁盘上,包含可执行机器指令和数据的...
  • wolfsun3
  • wolfsun3
  • 2015年09月30日 17:00
  • 393

linux c之创建进程fork和vfork函数之间的区别

1、函数简介       1)、得到当前的进程id pid_t getpid();       2)、fork函数          要创建进程,必须调用fork函数, 系统调用for...
  • u011068702
  • u011068702
  • 2017年01月12日 20:36
  • 434

Copy On Write和fork、vfork(很容易理解的图解)

转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html COW技术初窥:       在Linux程序中...
  • hustsselbj
  • hustsselbj
  • 2015年09月14日 00:01
  • 669

Linux进程创建:fork,vfork,exec,clone总结

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息,包括数据段,代码段,堆栈段的地址,当前进程的环境变量,文件的描述符等,在创建进程...
  • xitongfengxi
  • xitongfengxi
  • 2016年07月22日 14:42
  • 462

【Linux】进程的创建fork()和vfork()

1、fork()函数 #include pid_t fork(void); 一个现有进程可以调用fork创建一个新进程。 返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1。 2、vf...
  • Scenlyf
  • Scenlyf
  • 2016年07月23日 21:36
  • 587

fork()&vfork()

fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别:  1.  fork  ():子进程拷贝父进程的数据段,代码段      vfork ( ):子进程与父进程共...
  • xueli1991
  • xueli1991
  • 2017年01月04日 20:15
  • 93
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下系统调用之fork()和vfork()探索
举报原因:
原因补充:

(最多只允许输入30个字)