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

2021-09-12 07:49:13 字數 3072 閱讀 3330

//建立程序;

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

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

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

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

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

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

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

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

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

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

//訊號處理函式

void sig_usr(int signo)

int main(int argc, char *const *ar**)

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

pid = fork(); //建立乙個子程序

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

if(pid < 0)

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

for(;;)

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

return 0;

}

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

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

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

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

//如何乾掉殭屍程序:

//a)重啟電腦

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

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

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

//waitpid();

#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");

return 0;

}

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

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

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

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

//其他程序使用;

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

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

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

//g_mygbltest值也不同;

#include #include //malloc,exit

#include //fork

#include int g_mygbltest = 0;

int main(int argc, char *const *ar**)

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

//for(;;)

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

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

if(pid == 0)

}else

}return 0;

}

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

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

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

#include #include //malloc,exit

#include //fork

#include int main(int argc, char *const *ar**)

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

return 0;

}

//a)系統中程序太多

//預設情況,最大的pid:32767

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

//7788

3 6 fork函式詳解 範例演示

二 fork 函式進一步認識 三 完善一下fork 四 fork 失敗的可能性 1 2 防止殭屍程序的出現 3 fork會將程序一分為二執行接下來的 4 父子程序共享記憶體,當需要操作記憶體時才會申請記憶體空間 建立程序 程序的概念 乙個可執行程式,執行起來就是乙個程序,再執行起來一次,它就又是乙個...

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

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

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

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