Linux fork和vfork函数用法

forkvfork是用于创建新进程的函数,在Linux的C语言编程中非常常见。

fork函数

fork函数是用于创建一个新的进程,新进程是调用进程的副本。新进程将包含调用进程的地址空间、文件描述符、栈和数据。在fork之后,父进程和子进程将并发执行。

  • fork后会有两个并发程序执行
  • 子进程复制了父进程的数据段,包括全局变量

fork函数原型:

cpp 复制代码
pid_t fork(void);

fork函数返回值为:

  • 如果是在父进程中,返回新创建的子进程的进程ID;
  • 如果是在子进程中,返回0;
  • 若出现错误,返回-1。
cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/**
 * fork后会有两个并发程序执行
 * 子进程复制了父进程的数据段,包括全局变量
*/
int main() {
    pid_t val;
    printf("PID before fork(): %d\n",getpid());
    val = fork();
    // *********************************************************************
    if(val == 0) {
        printf("I am the child process, PID is %d\n", getpid());
    } else if(val > 0) {
        printf("I am parent process, PID is %d\n", getpid());
    } else {
        printf("Error");
    }
}

fork语句后开始父进程和子进程。

vfork函数

vfork函数是Linux和Unix系统中用于创建新进程的另一个函数,与fork函数类似,但行为有所不同。vfork创建的新进程与调用进程共享地址空间,这样可以减少内存的使用。然而,需要注意的是,在子进程调用execexit之前,父进程会被阻塞。

  • vfork创建的子进程与父进程共享地址空间
  • 调用vfork创建子进程后,父进程会被挂起,直到子进程结束
cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/**
 * vfork创建的子进程与父进程共享地址空间
 * 调用vfork创建子进程后,父进程被挂起,直到子进程结束。
*/
int A = 0;
int B = 0;
int main()
{
    pid_t val;
    val = vfork();
    if(val == 0) {
        ++A, ++B;
        printf("A: %d , B: %d\n", A, B);
    } else {
        ++A, ++B;
        printf("A: %d , B: %d\n", A, B);

    }
    
}

如果将vfork换为fork

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int A = 0;
int B = 0;
int main()
{
    pid_t val;
    val = fork();
    if(val == 0) {
        ++A, ++B;
        printf("A: %d , B: %d\n", A, B);
    } else {
        ++A, ++B;
        printf("A: %d , B: %d\n", A, B);

    }
    
}

可以发现:vfork创建的子进程与父进程共享地址空间。

相关推荐
.格子衫.7 分钟前
真题卷001——算法备赛
算法
XiaoyaoCarter17 分钟前
每日一道leetcode
c++·算法·leetcode·职场和发展·二分查找·深度优先·前缀树
Hygge-star35 分钟前
【数据结构】二分查找5.12
java·数据结构·程序人生·算法·学习方法
愚戏师43 分钟前
Linux复习笔记(六)shell编程
linux·笔记·shell
大胆飞猪1 小时前
Linux操作系统--进程间通信(system V共享内存)
linux
LunarCod1 小时前
Ubuntu使用Docker搭建SonarQube企业版(含破解方法)
linux·运维·服务器·ubuntu·docker·开源·sonarqube
betazhou2 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
什么半岛铁盒2 小时前
Linux信号的保存
linux·运维·网络
百锦再2 小时前
大数据技术的主要方向及其应用详解
大数据·linux·网络·python·django·pygame
June`2 小时前
专题二:二叉树的深度搜索(二叉树剪枝)
c++·算法·深度优先·剪枝