当前位置: 首页 > news >正文

网站开发经济可行性分析石龙做网站

网站开发经济可行性分析,石龙做网站,泰安网络网站,传播性wordpress主题学了好久终于搞懂fork函数的一些作用 1. fork函数作用:用于创建新的子进程 这是fork最根本的功能,在父进程里创建新的子进程、 但是创建新的子进程之后呢? 子进程和父进程的关系是什么样的? 为什么fork得到的子进程返回值为0&am…

学了好久终于搞懂fork函数的一些作用

1. fork函数作用:用于创建新的子进程

这是fork最根本的功能,在父进程里创建新的子进程、

但是创建新的子进程之后呢?

子进程和父进程的关系是什么样的?

为什么fork得到的子进程返回值为0,父进程得到的返回值是子进程pid?

以及多级fork函数调用,得到曾曾……曾孙子进程返回的pid是多少呢?

2. 继承父进程的一切

调用fork函数之后,父进程会创建一个几乎一模一样的子进程出来

几乎一模一样是什么意思?

  1. 子进程的代码和父进程完全相同
  2. 子进程的变量以及变量的值和父进程完全相同,包括全局变量,局部变量都相同,但是唯一的不同就是fork()函数的返回值不同,如果用一个变量接受fork函数返回值,那么父子进程这个变量的值就会不同
    1. 比如:父进程执行fork函数创建子进程,这个fork函数在父进程里返回的是子进程的 PID; 在子进程里返回的是 0
    2. 这是为了区分父子,因为他们完全一模一样的话操作系统也不知道谁是爹谁是儿了,就不方便管理,仅此而已
  3. 执行顺序也相同,子进程会接着父进程的执行顺序继续往下执行,也就是接着执行父进程执行fork()创建自己之后的代码,要注意的是如果子进程是在父进程的分支创建,那么子进程也就只能接着这个分支继续执行,也就是说,子进程和父进程执行逻辑一样,不会执行另一个分支,后面我们有题目讲解

再次提醒,fork在父进程的返回值是子进程pid,在子进程中返回0

父子关系判断很简单:这个fork函数谁调用的谁就是爹,被创建的儿子接着fork往下执行

3. 子进程创建新的子进程,子子孙孙无穷匮也?

父进程执行fork创建子进程A,子进程A也执行fork创建孙子进程B

我们知道父进程中执行一个fork返回子进程A的pid,且这个fork在子进程A会返回0

那么子进程A执行另一个fork创建孙子进程B,这个fork在子进程A的返回值是什么呢?

答案如下:

子进程A执行fork()创建孙子进程B,该fork在子进程A中返回孙子进程B的pid

那么聪明的你一定知道该fork在孙子进程B中返回值是0

因为子进程A执行fork函数创建孙子进程B,A是B的父亲,所以在中A返回B的PID,在B中返回0

4. 读如下代码,写出执行结果,并描述父子关系

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
​
int main()
{pid_t pid1, pid2, pid3;pid1 = 0, pid2 = 0, pid3 = 0;pid1 = fork();if (pid1 == 0){pid2 = fork();pid3 = fork();}else{pid3 = fork();if (pid3 == 0){pid2 = fork();}if ((pid1 == 0) && (pid2 == 0)){printf("Level 1\n");}if (pid1 != 0){printf("Level 2\n");}if (pid2 != 0){printf("Level 3\n");}if (pid3 != 0){printf("Level 4\n");}}return 0;
}

分析

  1. 父进程创建子进程1,pid1记录fork()返回值,也就是子进程1的pid,这里用pid1代指子进程1

  2. 父进程继续执行,遇到if-else分支,父进程的pid1保存子进程1的pid,不为0,进入else分支

    1. 父进程再次创建子进程2,pid3保存子进程2的pid

    2. 父进程的pid1和pid3不为0,pid2 = 0,故进入if(pid1!=0)和if(pid3!=0)分支,输出Level 2Level 4父进程结束

  3. 子进程1从pid1 = fork()之后开始执行,pid1 = fork返回值0,且子进程1继承父进程的pid2、pid3,所以子进程进入if分支

    1. 子进程创建孙子进程1,pid2 = 孙子进程1的pid,孙子进程还会创建曾孙子进程1

    2. 创建孙子进程2,pid3 = 孙子进程2的pid

    3. 子进程1结束

    4. 孙子进程1和孙子进程2以及曾孙子进程1都在if分支里,不会到else分支去,故不输出

  4. 子进程2从else 分支的第一个fork函数后开始运行,故pid3 = 0 (fork()返回值),继承父进程的 pid1 = 子进程1的pid,pid2 = 0

    1. 进入if(pid3 ==0)分支,创建孙子进程3,pid2 = 孙子进程3的pid

    2. 子进程2进入if(pid1 != 0) 和if(pid2 != 0)分支,分别输出Level 2和Level 3

    3. 子进程2结束

  5. 孙子进程3的pid2 = 0 (fork返回值),继承子进程2的pid1 = 子进程1的pid,pid3 = 0

    1. 进入if(pid1 != 0)分支,输出Level 2

故答案为:

Level 2
Level 4
Level 2
Level 3
Level 2

执行结果如下:

http://www.dtcms.com/a/592536.html

相关文章:

  • wordpress中国优化网络优化的目的
  • 【Linux网络】Socket编程TCP-实现Echo Server(下)
  • 路由协议的基础
  • ios 26的tabbar 背景透明
  • Hadoop大数据平台在中国AI时代的后续发展趋势研究CMP(类Cloudera CDP 7.3 404版华为鲲鹏Kunpeng)
  • Apache Jena:利用 SPARQL 查询与推理机深度挖掘知识图谱
  • Regression vs. Classification|回归vs分类
  • Nine.fun × AIOT重磅联手,打造健康娱乐新经济
  • The Life of a Read/Write Query for Apache Iceberg Tables
  • 网站显示图片标记html5做网站的代码
  • 做网站需要买多大空间哪里有好的免费的网站建设
  • gpt‑image‑1 —— OpenAI 全新图像生成模型全面解析
  • 基于scala使用flink将读取到的数据写入到kafka
  • 跨平台OPC UA开发:.NET、Java与C++ SDK的深度对比
  • 硬盘第一关:MBR VS GPT
  • 从原理到演进:vLLM PD分离KV cache传递机制全解析
  • 如何在浏览器侧边栏中使用GPT/Gemini/Claude进行网页对话?
  • 【gpt-oss-20b】一次 20B 大模型的私有化部署评测
  • zynq的PS端ENET网口引出到EMIO的PL引脚
  • 商城网站设计策划wordpress 去除归档链接
  • 李宏毅机器学习笔记44
  • 小杰-大模型(three)——RAG与Agent设计——Langchain-OutputParser输出解析器
  • LSTM核心参数与输入输出解读
  • 【机器学习算法】面试中的ROC和AUC
  • OSPF中的cost值
  • 《场景化落地:用 Linux 共享内存解决进程间高效数据传输问题(终篇)》
  • 襄阳建设网站首页向网站服务器上传网页文件下载
  • 视频去动态水印软件HitPaw安装和使用教程
  • O2OA(翱途)开发平台 v9.5 前端框架设计|开放 · 安全 · 可控 · 信创优选
  • CMakeList 中 PUBLIC 和 PRIVATE的区别