码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Linux fork和vfork函数用法


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

    fork函数

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

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

    fork函数原型:

    pid_t fork(void);
    
    • 1

    fork函数返回值为:

    • 如果是在父进程中,返回新创建的子进程的进程ID;
    • 如果是在子进程中,返回0;
    • 若出现错误,返回-1。
    #include 
    #include 
    #include 
    /**
     * 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");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    image-20231121145831531

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

    image-20231121150110720

    vfork函数

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

    • vfork创建的子进程与父进程共享地址空间
    • 调用vfork创建子进程后,父进程会被挂起,直到子进程结束
    #include 
    #include 
    #include 
    /**
     * 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);
    
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    image-20231121150436009

    如果将vfork换为fork:

    #include 
    #include 
    #include 
    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);
    
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    image-20231121150526469

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

  • 相关阅读:
    257. 关押罪犯 - AcWing题库 【细节二分 | 细节二分图】
    springboot整合mybatisplus,JPA,swagger2配置postgresql,clickhouse双数据源项目
    TStor CSP文件存储在大模型训练中的实践
    【微信小程序】微信小程序自定义标题跟随滚动
    Windows下搭建nginx和rtspToWebRTC以及Windows程序添加为服务开机启动和后台运行
    T1079 计算分数加减表达式的值(信息学一本通C++)
    二叉搜索树的基本操作 || TreeMap和TreeSet介绍
    【Redis专题】Redis持久化、主从与哨兵架构详解
    MyBatisPlus之逻辑删除、MyBatisPlus解决并发问题的乐观锁机制
    从 Vue2向Vue3的迁移
  • 原文地址:https://blog.csdn.net/qq_63432403/article/details/134532575
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号