3 6 fork函式詳解 範例演示

2021-10-03 15:38:34 字數 3291 閱讀 6903

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

三:完善一下fork()**

四:fork()失敗的可能性

**1:

**2:(防止殭屍程序的出現)

**3:(fork會將程序一分為二執行接下來的**)

**4:(父子程序共享記憶體,當需要操作記憶體時才會申請記憶體空間)

建立程序;

//程序的概念:

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

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

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

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

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

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

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

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

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

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

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

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

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

如何乾掉殭屍程序:

a)重啟電腦

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

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

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

waitpid();

b)fork()產生新程序的速度非常快,fork()產生的新程序並不複製原程序的記憶體空間,而是和原程序(父程序)一起共享乙個記憶體空間,但這個記憶體空間的特性是「寫時複製」,也就是說:

原來的程序和fork()出來的子程序可以同時、自由的讀取記憶體,但如果子程序(父程序)對記憶體進行修改的話,那麼這個記憶體就會複製乙份給該程序單獨使用,以免影響到共享這個記憶體空間的其他程序使用;

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

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

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

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

a)系統中程序太多

預設情況,最大的pid:32767

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

7788

#include

#include

//malloc,exit

#include

//fork

#include

//訊號處理函式

void

sig_usr

(int signo)

intmain

(int argc,

char

*const

*ar**)

//---------------------------------

pid =

fork()

;//建立乙個子程序

//要判斷子程序是否建立成功

if(pid <0)

//現在,父程序和子程序同時開始 執行了

for(;;

)printf

("再見了!\n");

return0;

}

#include

#include

//malloc,exit

#include

//fork

#include

#include

//waitpid

//訊號處理函式

void

sig_usr

(int signo)

//end switch

}int

main

(int argc,

char

*const

*ar**)if(

signal

(sigchld,sig_usr)

== sig_err)

//---------------------------------

pid =

fork()

;//建立乙個子程序

//要判斷子程序是否建立成功

if(pid <0)

//現在,父程序和子程序同時開始 執行了

for(;;

)printf

("再見了!\n");

return0;

}

#include

#include

//malloc,exit

#include

//fork

#include

intmain

(int argc,

char

*const

*ar**)

printf

("再見了!\n");

return0;

}

#include

#include

//malloc,exit

#include

//fork

#include

int g_mygbltest =0;

intmain

(int argc,

char

*const

*ar**)

//現在,父程序和子程序同時開始 執行了

//for(;;)

////printf("再見了!\n");

//走到這裡,fork()成功,執行後續**的可能是父程序,也可能是子程序

if(pid ==0)

}else

}return0;

}

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

一 fork 函式簡單認識 建立程序 程序的概念 乙個可執行程式,執行起來就是乙個程序,再執行起來一次,它就又是乙個程序 多個程序可以共享同乙個可執行檔案 文雅說法 程序 定義為程式執行的乙個例項 在乙個程序 程式 中,可以用fork 建立乙個子程序,當該子程序建立時,它從fork 指令的下一條 或...

(2 5)fork函式詳解 範例演示

建立程序 程序的概念 乙個可執行程式,執行起來就是乙個程序,再執行起來一次,它就又是乙個程序 多個程序可以共享同乙個 可執行檔案 文雅說法 程序 定義為程式執行的乙個例項 在乙個程序 程式 中,可以用fork 建立乙個子程序,當該子程序建立時,它從fork 指令的下一條 或者說從fork 的返回處 ...

3 7 守護程序詳解 範例演示

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