Linux的fork和vfork

简介: Linux的fork和vfork
  • fork
  • 用于创建子进程。
  • 在调用时,返回两次:子进程的返回值是0,父进程的返回值的新建子进程的ID。
  • 子进程是父进程的副本。子进程和父进程继续执行fork之后的指令。
  • 子进程获得父进程的 数据空间、堆、栈的副本
  • 共享的是:文件描述符、mmap建立的映射区
  • 子进程和父进程共享的是 代码段,fork 之后各自执行。
  • 父进程和子进程的执行顺序谁先谁后是未知的,是竞争的关系。
  • COW
    COW 即写时复制(Copy-On-Write), 数据空间、堆、栈的副本在创建子进程时并不创建副本。而是在父进程或者子进程修改这片区域时,内核为修改区域的那块内存制作一个副本,以提高效率。
  • forkfork失败的原因:
  • 系统中已经有太多的进程
  • 该实际用户Id的进程数超过了系统限制
  • 案例
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int globvar = 10;
char buf[] = "a writte to stdout.\n";
int main(int argv, char* argc[]){
    int var;
    pid_t pid;
    var = 88;
    if(write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1){
        printf("write error");
        exit(1);
    }
    printf("before fork.\n");
    // 创建子进程后,后面的代码,父进程和子进程独立运行。
    if((pid=fork()) < 0){
        printf("fork() error.\n");
        exit(1);
    }
    else if(pid == 0){
        globvar++; //子进程运行不改变父进程的值
        var++;
    }
    else
        sleep(2);
    printf("pid=%ld, globvar=%d, var=%d.\n",(long)getpid() , globvar, var);
    retdurn 0;
}
  1. vfo
  • 与 fork 一样都创建新的进程,他的是目的是执行一个程序。
  • 与fork的区别在于:
  • 它并不将父进程的地址空间复制到子进程中 。在子进程 exec/exit 之前,和父进程共享地址空间,提高了工作效率。但是在在子进程 exec/exit 之前,子进程如果修改了数据、进行函数调用、返回都会带来未知的结果。
  • vfork 保证子进程比父进程先运行,在子进程 exec/exit 之后父进程才会运行。
  • 案例
// 将上面的修改如下:
if((pid=vfork()) < 0){
    printf("fork() error.\n");
    exit(1);
}
else if(pid == 0){
    globvar++; // 会改变父进程的变量值
    var++;
    _exit(0);
}
// 去掉sleep(2)是因为vfork能保证子进程先运行
  • 结果对比:
# fork 
szz@ubuntu:~/Study/SystemProgram/IO$ ./f
a writte to stdout.
before fork.
pid=4304, globvar=11, var=89. # 子进程
pid=4303, globvar=10, var=88. # 父进程
# vfork
szz@ubuntu:./vf
a writte to stdout.
before fork.
pid=4301, globvar=11, var=89.# 父进程
  • 补充:
    fork 的两次返回:
  • gdb 调试
    set follow-fork-mode child : 跟踪子进程
    set follow-fork-mode parent : 跟踪父进程
  • 进程和程序的区别
    程序占用磁盘空间,进程占用系统资源。
相关文章
|
3天前
|
消息中间件 存储 Linux
Linux手账—exec和fork
本文介绍了Linux系统中进程控制的核心功能——`fork`和`exec`系列函数。`fork`用于创建新进程(子进程),继承父进程的资源但拥有独立的地址空间;`exec`系列函数则在当前进程中执行新程序,替换原有地址空间。文章详细解析了这些函数的基本概念、用法及工作原理,强调了它们在多进程编程中的重要性。
11 0
|
1月前
|
Linux
linux内核执行fork时对写时复制的设置
linux内核执行fork时对写时复制的设置
|
2月前
|
存储 Linux 调度
Linux 0.11 fork 函数(二)
Linux 0.11 fork 函数(二)
30 0
|
3月前
|
小程序 Linux
【编程小实验】利用Linux fork()与文件I/O:父进程与子进程协同实现高效cp命令(前半文件与后半文件并行复制)
这个小程序是在文件IO的基础上去结合父子进程的一个使用,利用父子进程相互独立的特点实现对数据不同的操作
|
4月前
|
算法 Linux 调度
Linux进程——进程的创建(fork的原理)
Linux进程——进程的创建(fork的原理)
130 2
|
5月前
|
Linux
linux中fork函数与vfork函数的区别
linux中fork函数与vfork函数的区别
|
5月前
|
Linux Shell 调度
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
|
5月前
|
算法 Linux Shell
【linux进程(二)】如何创建子进程?--fork函数深度剖析
【linux进程(二)】如何创建子进程?--fork函数深度剖析
|
安全 Linux 调度
关于linux系统如何实现fork的研究(二)【转】
转自:http://www.aichengxu.com/linux/7166015.htm 本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言   前一篇关于linux系统如何实现fork的研究(一)通过代码已经说明了从用户态怎么通过软中断实现调用系统调用clone函数,而clone函数的精华copy_process函数就在此篇文章中进行分析。
1025 0
|
Linux C语言
关于linux系统如何实现fork的研究(一)【转】
转自:http://www.aichengxu.com/linux/4157180.htm 引言 fork函数是用于在linux系统中创建进程所使用,而最近看了看一个fork()调用是怎么从应用到glibc,最后到内核中实现的,这片文章就聊聊最近对这方面研究的收获吧。
1081 0