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创建的子进程与父进程共享地址空间。

相关推荐
我是章汕呐9 小时前
地级市能源消耗量及消耗强度数据【2006-2023年】平衡面板
人工智能·经验分享·算法·回归
小小的木头人9 小时前
Linux systemd Service 与 Timer 定时任务原理及实战
linux
charliejohn9 小时前
计算机考研 408 数据结构 堆的插入与删除 堆排序
算法
老鱼说AI9 小时前
从点积到希尔伯特空间:向量内积的几何本质与大模型相似度度量
人工智能·深度学习·线性代数·算法·机器学习·数学建模
熊明才10 小时前
WSL2 网络突然瘫痪(Network is unreachable / 没有 eth0)最短修复指南(2026年9月20日亲测可用)
linux·windows·wsl2
地平线开发者10 小时前
模型部署|如何解决算子约束
深度学习·算法·自动驾驶
Tairitsu_H10 小时前
[Linux系统] 自动化构建make / Makefile | 进度条
linux·操作系统·makefile·make
行者全栈架构师10 小时前
大模型运维准确率不到 50%?我们用 DeepSeek V4 测了 5 大场景,结果出人意料
linux·人工智能·开源
Navigator_Z11 小时前
LeetCode //C - 1254. Number of Closed Islands
c语言·算法·leetcode
deepseek2311 小时前
GPT-6 Astra 破解 FrontierMath 九年悬案拆解:调和熵投票规则反证核恒非空,局部搜索如何终结反例悬赏
人工智能·算法·ai agent