fork函數小解

學了好久終于搞懂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.pswp.cn/bicheng/83202.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83202.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83202.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

opencv(C++) 變換圖像與形態學操作

文章目錄 使用腐蝕和膨脹圖像形態濾波器實現案例使用形態學濾波器對圖像進行開運算和閉運算實現案例在灰度圖像上應用形態學操作算子形態學梯度(Morphological Gradient)黑帽變換(Black-hat Transform)使用分水嶺算法進行圖像分割使用 MSER 提取顯著區域MSER 檢測與可視化使…

測試工程師學LangChain之promptTemplate 實戰筆記

一、引言:大模型時代的測試自動化革命 2025 年,隨著大模型(如 DeepSeek)在自動化測試領域的廣泛應用,Prompt 編寫已成為測試工程師的核心技能之一。 為什么? 大模型輸出的質量 90% 取決于輸入的 PromptLangChain 的 PromptTemplate 提供了參數化 Prompt 的標準化方案Ope…

CP2K 軟件介紹與使用指南

CP2K 軟件介紹與使用指南 一、CP2K簡介 CP2K是一款開源的量子化學和固態物理模擬軟件包&#xff0c;主要用于原子尺度模擬&#xff0c;特別擅長以下領域&#xff1a; 第一性原理計算&#xff1a;基于密度泛函理論(DFT)的電子結構計算分子動力學(MD)&#xff1a;包括從頭算分…

npm、pnpm、yarn使用以及區別

npm 使用 安裝包&#xff1a;在項目目錄下&#xff0c;npm install <包名> 用于本地安裝包到 node_modules 目錄&#xff0c;并添加到 package.json 的 dependencies 中&#xff1b;npm install -g <包名> 用于全局安裝&#xff0c;適用于命令行工具等。初始化項目…

2025年北京市職工職業技能大賽第六屆信息通信行業網絡安全技能大賽復賽CTF部分WP-哥斯拉流量分析

2025年北京市職工職業技能大賽第六屆信息通信行業網絡安全技能大賽復賽CTF部分WP-哥斯拉流量分析 一、流量分析 題目沒有任何提示,附件gzl.pcap 解題哥斯拉流量300多KB包很多,沒啥經驗只能挨個看回來之后又狠狠得擼了一把哥斯拉流量分析我這里用的是哥斯拉4.0.1 測試鏈接…

GitLab 18.0 正式發布,15.0 將不再受技術支持,須升級【六】

GitLab 是一個全球知名的一體化 DevOps 平臺&#xff0c;很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版&#xff0c;專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料&#xff1a; 極狐GitLab 官網極狐…

React 項目中封裝 Excel 導入導出組件:技術分享與實踐

文章目錄 前言一、為什么需要封裝 Excel 組件&#xff1f;二、技術選型三、核心實現1. 安裝依賴2. 封裝Excel導出3. 封裝導入組件 &#xff08;UploadExcel&#xff09; 總結 前言 在 React 項目中&#xff0c;處理 Excel 文件的導入和導出是常見的業務需求。無論是導出報表數…

RustDesk 搭建自建服務器并設置服務自啟動

目錄 0. 介紹 1. 事前準備 1.1 有公網 ip 的云服務器一臺 1.2 服務端部署包 1.3 客戶端安裝包 2. 部署 2.1 服務器環境準備 2.2 上傳服務端部署包 2.3 運行 pm2 3. 客戶端使用 3.1 安裝 3.2 配置 3.2.1 解鎖網絡設置 3.2.2 ID / 中級服務器 3.3 啟動效果 > …

基于Qt封裝數據庫基本增刪改查操作,支持多線程,并實現SQLite數據庫單例訪問

抽出來的&#xff0c;直接用就行 頭文件CPP文件使用示例 頭文件 #ifndef DATABASECOMMON_H #define DATABASECOMMON_H/** 單例封裝SQLite通用操作&#xff0c;支持多線程調用&#xff1b;可擴展兼容其他數據庫&#xff0c;照著SysRunDatabase寫&#xff0c;并且重載openDataba…

AI筆記 - 網絡模型 - mobileNet

網絡模型 mobileNet mobileNet V1網絡結構深度可分離卷積空間可分![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/aff06377feac40b787cfc882be7c6e5d.png) 參考 mobileNet V1 網絡結構 MobileNetV1可以理解為VGG中的標準卷積層換成深度可分離卷積 可分離卷積主要有…

第十五篇:MySQL 高級實戰項目:構建高可用、可觀測、性能優化一體化數據庫平臺

本篇聚焦于如何基于 MySQL 構建一個真正面向生產環境的數據庫平臺&#xff0c;集成高可用、可觀測與性能調優三大核心能力&#xff0c;助力穩定、可擴展的系統運行。 一、項目背景與目標 在實際生產環境中&#xff0c;數據庫系統需要應對以下挑戰&#xff1a; 業務高速增長帶來…

華為OD機試真題——文件目錄大小(2025 A卷:100分)Java/python/JavaScript/C++/C語言/GO六種語言最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 2025華為OD真題目錄+全流程解析/備考攻略/經驗分享 華為OD機試真題《文件目錄大小》: 目錄 題…

qwen 2.5 并行計算機制:依靠 PyTorch 和 Transformers 庫的分布式能力

qwen 2.5 并行計算機制:依靠 PyTorch 和 Transformers 庫的分布式能力 完整可運行代碼: import torch import torch.nn.functional as F from transformers

TIDB創建索引失敗 mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory.

TIDB創建索引失敗&#xff1a;解決“mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory”問題 在使用 TIDB 數據庫時&#xff0c;我們有時會遇到創建索引失敗的問題。常見的錯誤信息為&#xff1a; mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directo…

華為OD機試真題—— 最少數量線段覆蓋/多線段數據壓縮(2025A卷:100分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 2025華為OD真題目錄+全流程解析/備考攻略/經驗分享 華為OD機試真題《最少數量線段覆蓋/多線段數…

EasyRTC嵌入式音視頻實時通話SDK助力AI與IoT智能硬件打造音視頻交互多場景應用

一、引言? 在數字化浪潮下&#xff0c;AI與IoT深度融合重塑智能硬件產業。實時音視頻通信是智能硬件交互的核心&#xff0c;其性能關乎用戶體驗與場景拓展。EasyRTC嵌入式音視頻實時通話SDK基于WebRTC技術&#xff0c;以輕量、易擴展的特性&#xff0c;為AI與IoT智能硬件融合…

第十四章 MQTT訂閱

系列文章目錄 系列文章目錄 第一章 總體概述 第二章 在實體機上安裝ubuntu 第三章 Windows遠程連接ubuntu 第四章 使用Docker安裝和運行EMQX 第五章 Docker卸載EMQX 第六章 EMQX客戶端MQTTX Desktop的安裝與使用 第七章 EMQX客戶端MQTTX CLI的安裝與使用 第八章 Wireshark工具…

【第4章 圖像與視頻】4.4 離屏 canvas

文章目錄 前言為什么要使用 offscreenCanvas為什么要使用 OffscreenCanvas如何使用 OffscreenCanvas第一種使用方式第二種使用方式 計算時長超過多長時間適合用Web Worker 前言 在 Canvas 開發中&#xff0c;我們經常需要處理復雜的圖形和動畫&#xff0c;這些操作可能會影響頁…

Go語言事件總線EventBus本地事件總線系統的完整實現框架

在Go語言中&#xff0c;EventBus是一種非常有用的工具&#xff0c;它通過事件驅動的編程方式&#xff0c;幫助開發者實現組件之間的解耦&#xff0c;提高代碼的可維護性和擴展性。 背景 軟件架構的發展需求&#xff1a;隨著軟件系統的規模和復雜度不斷增大&#xff0c;傳統的緊…

Go語言接口:靈活多態的核心機制

引言 Go語言的接口系統是其??面向對象編程??的核心&#xff0c;它摒棄了傳統語言的類繼承體系&#xff0c;采用獨特的??隱式實現??和??鴨子類型??設計。這種設計使得Go接口既靈活又強大&#xff0c;成為構建松耦合系統的關鍵工具。本文將深入剖析Go接口的實現機制…