//建立程序;//程序的概念:乙個可執行程式,執行起來就是乙個程序,再執行起來一次,它就又是乙個程序(多個程序可以共享同乙個 可執行檔案)
//文雅說法:程序 定義為程式執行的乙個例項;
//在乙個程序(程式)中,可以用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 終端被佔住了,你輸入各種命令這個終端都沒有反應 守護程序 一種長期執行的程序 這...