`
xiaoheliushuiya
  • 浏览: 396940 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
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;
}
运行结果:




分享到:
评论

相关推荐

    Linux 创建子进程执行任务的实现方法

    Linux 系统中通过 fork/vfork 系统调用来创建新进程。本文将介绍如何使用 fork/vfork 系统调用来创建新进程并使用 exec 族函数在新进程中执行任务。 fork 系统调用 要创建一个进程,最基本的系统调用是 fork: # ...

    浅谈Linux vfork与fork简单对比分析

    本文分享了Linux vfork与fork简单对比分析,分享给大家,具体如下: fork相关问题: 一、fork基础了解 fork作用为创建一个子进程,在使用了fork命令后,内核会分配新的内存块和数据结构给子进程,并且将父进程的...

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 ...

    linux进程创建详解

    详细的描述linux系统调用fork、vfork、clone在内核中的实现,既有详细文字描述又有全部的源码加注释,有助于深入理解linux进程地址空间

    linux内核源代码情景分析

    4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 ...

    LINUX内核源代码情景分析

    4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作

    Fork()函数与Linux中的多线程编程

     系统调用函数fork()是创建一个新进程的方式,当然vfork()也可以创建进程,但是实际上其还是调用了fork()函数。fork()函数是Linux系统中一个比较特殊的函数,其一次调用会有两个返回值,下面是fork()函数的声明: ...

    linux 内核源代码分析

    4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件...

    LINUX内核源代码情景分析(上).part1.rar

    4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件...

    Linux内核情景分析

    4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 ...

    Linux内核情景分析(非扫描版)

    4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 ...

    《linux编程技术》-实验3.doc

     3,要求分别用fork和vfork创建子进程。 实验五  创建子进程一,在子进程中递归打印/home目录中的内容(用exec系列函数调用第二次实验中的代码完成此功能);  1.子进程结束的时候完成以下功能:  打印字符...

    sfork:用于在Linux上启动进程的同步单线程接口

    sfork是Linux上新系统调用的原型,它为启动进程提供了同步的单线程接口。 sfork可以看作是vfork一种变体,它做了使vfork实际上有用和可用的最少工作量。 尤其是, sfork消除了vfork在子进程中可以执行的所有传统...

    UNIX高级编程 计算机科学丛书

    下图示出了系统V和4.XBSD的最近进展情况。 4.XBSD是由加州大学贝克莱分校计算机系统研究组开发的。该研究组也发布BSD NET1和BSD NET2版,它们包含了4.XBSD系统公众可用源代码。SVRX是AT& T的系统V的简称。XPG3是...

    UNIX环境高级编程_第二版中文

    1.11 系统调用和库函数  1.12 小结  习题  第2章 UNIX标准化及实现  2.1 引言  2.2 UNIX标准化  2.2.1 ISO C  2.2.2 IEEE POSIX  2.2.3 Single UNIX Specification  2.2.4 FIPS  2.3 UNIX系统...

    UNIX环境高级编程_第2版.part1

    1.11 系统调用和库函数16 1.12 小结17 习题18 第2章unix标准化及实现19 2.1 引言19 2.2 unix标准化19 2.2.1 iso c 19 2.2.2 ieee posix 20 2.2.3 single unix specification 25 .2.2.4 fips 26 2.3 unix...

    UNIX环境高级编程_第2版.part2

    1.11 系统调用和库函数16 1.12 小结17 习题18 第2章unix标准化及实现19 2.1 引言19 2.2 unix标准化19 2.2.1 iso c 19 2.2.2 ieee posix 20 2.2.3 single unix specification 25 .2.2.4 fips 26 2.3 unix...

    UNIX环境高级编程(第二版中文)

    1.11 系统调用和库函数 16 1.12 小结 17 习题 18 第2章 UNIX标准化及实现 19 2.1 引言 19 2.2 UNIX标准化 19 2.2.1 ISO C 19 2.2.2 IEEE POSIX 20 2.2.3 Single UNIX Specification 25 2.2.4 FIPS...

    unix环境编程电子书

    1 1.1 引言 1 1.2 UNIX体系结构 1 1.3 登录 1 1.4 文件和目录 3 1.5 输入和输出 6 1.6 程序和进程 8 1.7 出错处理 10 1.8 用户标识 12 1.9 信号 14 1.10 时间值 15 1.11 系统调用和库函数 ...

    UNIX环境高级编程

    1.11 系统调用和库函数 16 1.12 小结 17 习题 18 第2章 UNIX标准化及实现 19 2.1 引言 19 2.2 UNIX标准化 19 2.2.1 ISO C 19 2.2.2 IEEE POSIX 20 2.2.3 Single UNIX Specification 25 2.2.4 FIPS...

Global site tag (gtag.js) - Google Analytics