通訊架構實戰 3 6 fork函式詳解 範例演示

2021-10-04 07:58:46 字數 1644 閱讀 2628

一:fork()函式簡單認識

建立程序;

程序的概念:乙個可執行程式,執行起來就是乙個程序,再執行起來一次,它就又是乙個程序(多個程序可以共享同乙個可執行檔案)

文雅說法:程序 定義為程式執行的乙個例項;

在乙個程序(程式)中,可以用fork()建立乙個子程序,當該子程序建立時,

它從fork()指令的下一條(或者說從fork()的返回處)開始執行與父程序相同的**;

a)說白了:fork()函式產生了乙個和當前程序完全一樣的新程序,並和當前程序一樣從fork()函式裡返回;

原來一條執行通路(父程序),現在變成兩條(父程序+子程序)

fork():一分二; *********

(1.1)fork()函式簡單範例

ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -e 'bash|pid|nginx'

fork()之後,是父程序fork()之後的**先執行還是子程序fork()之後的**先執行是不一定的;這個跟核心排程演算法有關;

kill子程序,觀察父程序收到什麼訊號:sigchld訊號 ,子程序變成了殭屍程序z

(1.2)殭屍程序的產生、解決,sigchld

殭屍程序的產生:在unix系統中,乙個子程序結束了,但是他的父程序還活著,

但該父程序沒有呼叫(wait/waitpid)函式來進行額外的處置,那麼這個子程序就會變成乙個殭屍程序;

殭屍程序:已經被終止,不幹活了,但是依舊沒有被核心丟棄掉,因為核心認為父程序可能還需要該子程序的一些資訊;

作為開發者,堅決不允許殭屍程序的存在;

如何乾掉殭屍程序:

a)重啟電腦

b)手工的把殭屍程序的父程序kill掉,殭屍程序就會自動消失;

sigchld訊號:乙個程序被終止或者停止時,這個訊號會被傳送給父程序;

所以,對於原始碼中有fork()行為的程序,我們 應該攔截並處理sigchld訊號;

waitpid();

二:fork()函式進一步認識

b)fork()產生新程序的速度非常快,fork()產生的新程序並不複製原程序的記憶體空間,而是和

原程序(父程序)一起共享乙個記憶體空間,但這個記憶體空間的特性是「寫時複製」,也就是說:

原來的程序和fork()出來的子程序可以同時、自由的讀取記憶體,但如果子程序(父程序)對

記憶體進行修改的話,那麼這個記憶體就會複製乙份給該程序單獨使用,以免影響到共享這個記憶體空間的

其他程序使用;

三:完善一下fork()**

fork()回返回兩次:父程序中返回一次,子程序中返回一次,而且,fork()在父程序中返回的值和在子程序中返回的值是不同的

子程序的fork()返回值是0;

父程序的fork()返回值是新建立的子程序的id,因為全域性量g_mygbltest的值發生改變,導致主,子程序記憶體被單獨的分開,所以每個的

g_mygbltest值也不同;

(3.1)乙個和fork()執行有關的邏輯判斷(短路求值)

||或:有1出1,全0出0;

&&與:全1出1,有0出0;

四:fork()失敗的可能性

a)系統中程序太多

預設情況,最大的pid:32767

b)每個使用者有個允許開啟的程序總數;

7788

linux c 通訊架構實戰篇詳細介紹

架構 架構師 1 架構師的責任 負責產品 軟體 的總體規劃設計 把掌握的技術整合 融合,從而構成乙個產品。2 架構師寫 的問題 從高階或者資深軟體開發工程師公升上去 比較靠譜 程式設計師 靠 說話和吃飯的,紮實,從點到面來學 把每一段 寫好,自然就能連成乙個面 沒有15年的堅持不斷的磨礪的經驗,難以...

通訊架構實戰 3 7 守護程序詳解 範例演示

一 普通程序執行觀察 ps eo pid,ppid,sid,tty,pgrp,comm,stat,cmd grep e bash pid nginx a 程序有對應的終端,如果終端退出,那麼對應的程序也就消失了 它的父程序是乙個bash b 終端被佔住了,你輸入各種命令這個終端都沒有反應 二 守護程...

架構實戰 筆記

通過合理的內部編排,保證系統高度有序,能夠經過不斷發展,滿足業務和技術的變化。痛點 開發 業務架構 應用架構 機器 技術架構 概念 邏輯 物理 業務 可擴充套件 可復用 技術 可效能 高可用 可伸縮 了解業務 打造柔性系統 擴充套件性 模組拆分 整合 拆分 水平 垂直 整合 平台話 3 電商平台 單...