码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Linux】进程概念 —— fork函数


    目录

    一.概念

    二.解释

    1.现象与原理

    2.fork函数的用法

    3.fork函数为什么会有两个返回值

    4.扩展问题


    一.概念

    本质:fork函数是一个system call,也就是系统调用

    作用:创建子进程

    参数:无参

    返回值:

            1.类型是pid_t,本质就是int类型

            2.创建失败:返回-1;

               创建成功:有两个返回值,给父进程返回子进程的pid,给子进程返回0

    包含头文件:unistd.h

    二.解释

    1.现象与原理

    2.fork函数的用法

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. pid_t id = fork();
    7. if(id < 0)//fork创建子进程失败
    8. {
    9. perror("fork");//打印错误信息
    10. exit(0);//结束进程
    11. }
    12. else if(id == 0)//执行子进程代码
    13. {
    14. //...
    15. //例如
    16. while(1)
    17. {
    18. printf("This is Son Process, ret:%d, pid:%d, ppid:%d\n",id,getpid(),getppid());
    19. sleep(1);
    20. }
    21. }
    22. else//执行父进程代码
    23. {
    24. //...
    25. //例如
    26. while(1)
    27. {
    28. printf("This is Parent Process, ret:%d, pid:%d, ppid:%d\n",id,getpid(),getppid());
    29. sleep(1);
    30. }
    31. }
    32. return 0;
    33. }

    可以看到else if 与 else的代码同时执行了!

    两个while死循环同时执行了!!

    为什么会这样?

    就是因为这是两个进程,两个共享fork之后的代码,但独立运行,互不干扰

    此外,这里在实际应用中就用fork返回值id分别让父子进程执行不同的代码

    但是有人问父子进程代码在fork之后不是共享的吗?

    答:是共享的,共享与能执行是两回事,父子进程彼此能看到对方的代码,但是能执行的代码被返回值分开了

    3.fork函数为什么会有两个返回值

    为什么给子进程返回0,为什么给父进程返回子进程的pid?

    答:每个父亲可以有多个孩子,但每个孩子只会有一个父亲,所以父亲需要给孩子起名字来标识这个孩子

    为什么fork函数有两个返回值,难道之前学的函数只有一个返回值不对吗?

    答:函数有且仅有一个返回值,这一结论是肯定的!

    那么为什么fork有两个返回值?

    当前阶段,只能先简单认识一下。

    但是这里有遗留问题!!!

    返回两次,不代表会被记录两次,同一个变量:id,怎么会能同时记录两个数据呢?

    这个问题在后面的博客中会给出解释,目前为止理解到这里就可以了

    4.扩展问题

    fork一次,创建一个子进程,一共有两个进程

    那么fork两次,fork三次,fork四次,一共有多少个进程??

    对于这个问题,先画出一张图,就可以很容易的解释了。

    总结规律:n次fork一共会有2^n个进程

  • 相关阅读:
    2023年海南省职业院校技能大赛(高职组)应用软件系统开发赛项规程
    PCL 基于任意四点计算球心坐标
    哈希的使用
    vuex+localStorage实现vue-element-admin模板刷新页面记忆选项卡
    构建部署_Docker常用命令
    如何用python一键保存绝美***壁纸?
    html静态网站基于游戏网站设计与实现共计10个页面 (仿地下城与勇士游戏网页)
    解密zkLogin:探索前沿的Sui身份验证解决方案
    Android热修复Sophix的使用
    信创丨豪越科技与达梦数据库完成产品兼容互认证
  • 原文地址:https://blog.csdn.net/Hello_World_213/article/details/126167600
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号