P10 Linux進程編程 fork創建子進程

目錄

前言?

?01 fork()創建子進程

示例 1使用 fork()創建子進程。

02 fork創建新進程時發生了什么事?

?2.1 父、子進程中對應的文件描述符指向了相同的文件表?


前言?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

🎬 個人主頁:@ChenPi

🐻推薦專欄1: 《Linux C應用編程(概念類)_@ChenPi的博客-CSDN博客》????

🔥 推薦專欄2: 《C++_@ChenPi的博客-CSDN博客》???

🛸推薦專欄3: ??????《鏈表_@ChenPi的博客-CSDN博客 》 ???
🌺本篇簡介 ?:? 上一章我們講了Linux進程的概念以及獲取進程ID號和獲取父進程的ID

? ? ? ? ? ? ? ? ? ? ? ? ? 這一章我們引進新的概念,父子進程

Linux 是一個多用戶多任務的操作系統,每個用戶可以同時運行多個程序

進程是程序運行的主體,包括進程的創建,調度和消亡的整個過程

當用戶執行一個指令或者啟動一個程序時,就創建了一個進程

一個運行的程序也可能有多個進程。

每個進程將被分配各種資源 ? ?

?01 fork()創建子進程

一個現有的進程可以調用 fork()函數創建一個新的進程,

調用 fork()函數的進程稱為父進程,

由 fork()函 數創建出來的進程被稱為子進程(child process),

fork()函數原型如下所示(fork()為系統調用):

2.1 fork()函數原型:

#include <unistd.h>?pid_t fork(void);?

返回值:?

  1. 失敗返回-1 不創建子進程,并設置 errno?
  2. 父進程的返回值pid為子進程的pid號,子進程的返回值為0

在諸多的應用中,創建多個進程是任務分解時行之有效的方法

  1. 譬如,某一網絡服務器進程可在監聽客 戶端請求的同時,為處理每一個請求事件而創建一個新的子進程,與此同時,服務器進程會繼續監聽更多的 客戶端連接請求
  2. 在一個大型的應用程序任務中,創建子進程通常會簡化應用程序的設計,同時提高了系統 的并發性(即同時能夠處理更多的任務或請求多個進程在宏觀上實現同時運行)。

理解 fork()系統調用的關鍵在于,完成對其調用后將存在兩個進程,

一個是原進程(父進程)、另一個 則是創建出來的子進程,

并且每個進程都會從 fork()函數的返回處繼續執行,會導致調用 fork()返回兩次值,

子進程返回一個值、父進程返回一個值,所以fork返回值后面的代碼塊也會調用兩次

在程序代碼中,可通過返回值來區分是子進程還是父進程。

fork()調用成功后,將會在父進程中返回子進程的 PID,而在子進程中返回值是 0;

如果調用失敗,父進 程返回值-1,不創建子進程,并設置 errno。

fork()調用成功后,子進程和父進程會繼續執行 fork()調用之后的指令,子進程、父進程各自在自己的進程空間中運行。

事實上,子進程是父進程的一個副本

  1. 譬如子進程拷貝了父進程的數據段、堆、棧以及繼承 了父進程打開的文件描述符
  2. 父進程與子進程并不共享這些存儲空間
  3. 這是子進程對父進程相應部分存儲 空間的完全復制
  4. 執行 fork()之后,每個進程均可修改各自的棧數據以及堆段中的變量,而并不影響另一個進程

示例 1使用 fork()創建子進程。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>int main()
{int pid = ?fork(); //父進程的返回值pid為子進程的pid號,子進程的返回值為0switch (pid){case -1:printf("fork error\n");break;case 0:printf("this is child ;PID = %d\n",getpid());break;default:printf("this is father;PID = %d\n",getpid());break;}return 0;
}

?

?從打印結果可知,fork()之后的語句被執行了兩次,所以 switch…case 語句被執行了兩次

  1. 第一次進入 到了"case 0"分支,表示進入子進程
  2. 第二次進入到了 default 分支,表示當前處于父進程
  3. 父進程的返回值pid為子進程的id號,子進程的返回值為0?

02 fork創建新進程時發生了什么事?

調用 fork()函數之后,子進程會獲得父進程所有文件描述符的副本

這些副本的創建方式類似于 dup(), 這也意味著父、子進程對應的文件描述符均指向相同的文件表,如下圖所示:

由此可知

子進程拷貝了父進程的文件描述符表,使得父、子進程中對應的文件描述符指向了相同的文件表

也意味著父、子進程中對應的文件描述符指向了磁盤中相同的文件,

因而這些文件在父、子進程間實 現了共享,

譬如,如果子進程更新了文件偏移量,那么這個改變也會影響到父進程中相應文件描述符的位置 偏移量。 ?

?2.1 父、子進程中對應的文件描述符指向了相同的文件表?

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#define MY_FILE "./file.txt"int main()
{char buf [128];int fd = open(MY_FILE,O_RDWR|O_CREAT,0600);if(-1 == fd){perror("open error? :");exit(-1);}int pid = fork();switch (pid){case -1:printf("fork error\n");break;case 0:for(int i = 0;i<4;i++)write(fd," child",strlen(" child"));close(fd);break;default:for(int i = 0;i<4;i++)write(fd," father",strlen(" father"));close(fd);break;}return 0;
}

上述代碼中,父進程 open 打開文件之后,才調用 fork()創建了子進程,

所以子進程了繼承了父進程打 開的文件描述符 fd,我們需要驗證的便是兩個進程對文件的寫入操作是分別各自寫入、還是每次都在文件 末尾接續寫入

有上述測試結果可知,此種情況下

父、子進程分別對同一個文件進行寫入操作,結果是接續寫

不管是父進程,還是子進程,在每次寫入時都是從文件的末尾寫入很像使用了 O_APPEND 標志的效果。

其原 因也非常簡單

子進程繼承了父進程的文件描述符,兩個文件描述符都指向了一個相同的文件表,意味著它們的文件偏移量是同一個、綁定在了一起,相互影響,子進程改變了文件的位置 偏移量就會作用到父進程,同理,父進程改變了文件的位置偏移量就會作用到子進程

但是執行結果不一定是父進程先執行或者子進程先執行,這個不一定的,這個要看系統的調度了?
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210126.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210126.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210126.shtml

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

相關文章

異步回調模式

異步回調 所謂異步回調&#xff0c;本質上就是多線程中線程的通信&#xff0c;如今很多業務系統中&#xff0c;某個業務或者功能調用多個外部接口&#xff0c;通常這種調用就是異步的調用。如何得到這些異步調用的結果自然也就很重要了。 Callable、Future、FutureTask publi…

半導體劃片機助力氧化鋁陶瓷片切割:科技與工藝的完美結合

在當今半導體制造領域&#xff0c;氧化鋁陶瓷片作為一種高性能、高可靠性的材料&#xff0c;被廣泛應用于各種電子設備中。而半導體劃片機的出現&#xff0c;則為氧化鋁陶瓷片的切割提供了新的解決方案&#xff0c;實現了科技與工藝的完美結合。 氧化鋁陶瓷片是一種以氧化鋁為基…

《巫師3》缺失vcomp110.dll如何解決,如何快速修復vcomp110.dll丟失問題

在日常使用電腦的過程中&#xff0c;我們可能會遇到一些錯誤提示&#xff0c;其中之一就是“vcomp110.dll丟失”。這個錯誤提示通常意味著vcomp110.dll文件在系統中無法找到或加載。那么&#xff0c;vcomp110.dll丟失的原因是什么&#xff1f;它對電腦有什么影響&#xff1f;本…

高德地圖vue實現自定義標點熱力圖效果(縮放時展示不同數據)

高德地圖插件引入省略。。。樣式和vue基礎組件省略。。。 如果每個標點沒有數值&#xff0c;則可以用點聚合來實現功能下面例子&#xff0c;每個標點會有按市統計的數值&#xff0c;而且縮放一定程度時&#xff0c;需要展示按省統計的標點&#xff0c;因此需要自定義標點樣式和…

leetcode刷題日志-54螺旋矩陣

思路&#xff1a; 上下左右設置四個邊界 每走完一行或者一列&#xff0c;移動相應邊界&#xff0c;當左邊界大于右邊界&#xff0c;或者上邊界大于下邊界時&#xff0c;結束 代碼如下&#xff1a; class Solution {public List<Integer> spiralOrder(int[][] matrix) {…

線程上下文切換

線程上下文切換 巧妙地利用了時間片輪轉的方式, CPU 給每個任務都服務一定的時間&#xff0c;然后把當前任務的狀態保存下來&#xff0c;在加載下一任務的狀態后&#xff0c;繼續服務下一任務&#xff0c;任務的狀態保存及再加載, 這段過程就叫做上下文切換。時間片輪轉的方式…

Determining Which Version of GDS is Installed

Determining Which Version of GDS is Installed To determine which version of GDS you have, run the following command: $ gdscheck.py -v Example output: GDS release version: 1.0.0.78 nvidia_fs version: 2.7 libcufile version: 2.4

冒泡排序和直接選擇排序(C/C++實現)

文章目錄 冒泡排序(交換排序&#xff09;基本思想特性總結代碼實現 直接選擇排序基本思想特性總結代碼實現&#xff08;優化&#xff0c;每次循環同時選擇最小和最大的數&#xff09; 冒泡排序(交換排序&#xff09; 基本思想 基本思想&#xff1a;所謂交換&#xff0c;就是根…

class065 A星、Floyd、Bellman-Ford與SPFA【算法】

class065 A星、Floyd、Bellman-Ford與SPFA【算法】 2023-12-9 19:27:02 算法講解065【必備】A星、Floyd、Bellman-Ford與SPFA code1 A*算法模版 // A*算法模版&#xff08;對數器驗證&#xff09; package class065;import java.util.PriorityQueue;// A*算法模版&#xff…

vue3+TypeScript全局事件總線mitt

在vue3中 $ on&#xff0c;$off 和 $once 實例方法已被移除&#xff0c;組件實例不再實現事件觸發接口&#xff0c;因此大家熟悉的EventBus便無法使用了。然而我們習慣了使用EventBus&#xff0c;對于這種情況我們可以使用Mitt庫 npm i mitt -S 首先要在全局掛載 mitt 在app…

兩年外包生涯做完,感覺自己廢了一半。。。。。

先說一下自己的情況&#xff0c;本科生&#xff0c;19年通過校招進入南京某軟件公司&#xff0c;干了接近2年的功能測試&#xff0c;今年年初&#xff0c;感覺自己不能夠在這樣下去了&#xff0c;長時間呆在一個舒適的環境會讓一個人墮落!而我已經在一個企業干了2年的功能測試&…

laravel的ORM 對象關系映射

Laravel 中的 ORM&#xff08;Eloquent ORM&#xff09;是 Laravel 框架內置的一種對象關系映射系統&#xff0c;用于在 PHP 應用中與數據庫進行交互。Eloquent 提供了一種優雅而直觀的語法&#xff0c;使得開發者可以使用面向對象的方式進行數據庫查詢和操作。 定義模型&…

結合ColorUI組件開發微信小程序

1.自定義組件生命周期函數&#xff1a; Component({data: {},attached() {console.log("自定義組件生命周期函數 attached--先執行");this.getPos();},ready() {console.log("ready生命周期函數---在attached之后執行")},methods: {getPos() {var that th…

數據結構:位圖、布隆過濾器以及海量數據面試題

位圖、布隆過濾器以及海量數據面試題 1.位圖1.1概念1.2實現1.3位圖應用 2.布隆過濾器2.1布隆過濾器的提出2.2布隆過濾器的概念2.3布隆過濾器的查找2.4布隆過濾器的實現2.5布隆過濾器的刪除2.6布隆過濾器的優點2.7布隆過濾器的缺點 3.海量數據面試題3.1哈希切分3.2位圖應用3.3布…

如何成為前1%的程序員

如果你想成為前1%的程序員&#xff0c;你必須遵循1%的程序員做什么&#xff0c;了解其他99%的人不做什么。在現代&#xff0c;我們有各種學習平臺&#xff0c;里面充滿了與編程相關的視頻、圖文以及其他資料。 舉例來說&#xff0c;我作為編程的初學者&#xff0c;去尋找路線圖…

IDEA2023找不到add framework support怎么解決

問題: 我的idea版本是2023.01&#xff0c;新版idea右鍵項目沒有Add Framework Support&#xff0c;help里面也找不到相關的。 從project structue的facets里面添加就行了&#xff0c;都是一樣的。 1.依舊是新建一個項目 2.file-->project structure--->facets 左上角加…

數據結構與程序的關系

在計算機科學中,數據結構和算法是兩個核心的概念。數據結構是程序的基礎,它組織和存儲數據的方式直接影響程序的設計、效率、可讀性以及程序的錯誤檢測和調試。本文將詳細討論數據結構如何影響程序,以及數據結構與算法的組合如何使程序更高效、可靠。 一、數據結構的選擇影…

Android studio如何安裝ai輔助工具

引言 在沒有翻墻的情況下&#xff0c;即單純在公司打工&#xff0c;經測試&#xff0c;大部分ai工具都是使用不了的&#xff08;比如各種gpt,codeium,copilot&#xff09;&#xff0c;根本登錄不了賬號&#xff0c;但有一個國內的codegeex是可以使用的&#xff0c;在這里不對各…

tensorflow中張量tensor

在 TensorFlow 中&#xff0c;主要操作的對象是張量&#xff08;tf.Tensor&#xff09;。張量表示一個多維數組&#xff0c;可以執行各種操作以構建和修改計算圖。以下是一些常見的 TensorFlow 張量操作&#xff1a; 1. 創建張量&#xff1a; 使用 tf.constant 創建常量張量。…

Android app性能優化指南

Android應用性能優化指南 提高應用程序的性能以實現更流暢的用戶體驗和更高的可見度。 性能在任何應用程序的成功中發揮著重要的作用。為用戶提供流暢無縫的體驗應該是開發人員的重點。 應用程序大小 在用戶開始使用我們的應用程序之前&#xff0c;他們需要下載應用程序并將…