從例項中深入理解fork

2021-10-01 07:51:31 字數 3389 閱讀 4571

原共有17個fork例項,此日誌從中挑選部分例項進行學習,由簡入難

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

*ar**)

return0;

}

**總覽
void

fork1()

else

printf

("bye from process %d with x = %d\n"

,getpid()

, x)

;}

編譯執行

知識點分析

這是乙個簡單的fork函式例項,以此來介紹fork基礎知識

**分析

若先進入子程序,此時x=1,進行++x操作後x=2,但此操作不會對父程序中的x造成影響,故進入父程序後,此時依舊是x=1,進行- -x操作後x=0,從而出現以上圖示結果。

**總覽

void

fork2()

編譯執行

**分析

這個例子中呼叫了多個fork函式,這時我們會畫fork程序圖來分析結果。如下所示:

由於父程序和子程序的併發進行,這個程式在不同的系統中會有多種不同的執行結果,如「l0 l1 l1 bye bye bye bye」也是可能的序列,但"l0"不可能在"l1"和"bye"後面輸出。

**總覽

void

fork4()

}printf

("bye\n");

}

編譯執行

**分析

fork程序圖如下:

此程式中用 if (fork() != 0) 判斷正在進行的程序是否是父程序(父程序進行時fork返回非0數),若不是父程序則直接進行最後乙個printf函式的呼叫,具體情況如程序圖所示。此程式也有多種執行結果。

**總覽

void

cleanup

(void

)void

fork6()

編譯執行

知識點分析

**分析

呼叫fork函式後,父程序結束後會呼叫atexit函式,從而呼叫cleanup函式輸出「cleaning up」,子程序亦然,故輸出兩行「cleaning up」。

**總覽

void

fork7()

else

}

編譯執行

**分析

命令列中輸入「ps」可以檢視所有正在執行的程式

此程式在進入父程序後無限迴圈,有兩個解決方法。

**總覽

void

fork8()

else

}

編譯執行

知識點分析

**分析

這個程式與上個程式不同的地方在於父程序退出了,子程序進入了死迴圈。

**總覽

void

fork9()

else

printf

("bye\n");

}

編譯執行

**分析

fork程序圖如下:

**總覽

void

fork11()

}

void

fork12()

for(i =

0; i < n; i++

)for

(i =

0; i < n; i++

)}

編譯執行

fork11

fork12

知識點分析

序號名稱

相應事件

2sigint

來自鍵盤的中斷

9sigkill

殺死程式

14sigalrm

來自alarm函式的定時器訊號

17sigchld

乙個子程序停止或終止

**分析**總覽

void

int_handler

(int sig)

void

fork13()

for(i =

0; i < n; i++

)for

(i =

0; i < n; i++

)}

編譯執行

知識點分析

**分析

所有的子程序進入死迴圈後,呼叫kill函式給每個子程序傳送了sigint訊號,signal函式接收到訊號後,呼叫int_handler函式,讓每個子程序都以標籤0正常退出了,故執行結果為上圖。

**總覽

void

fork16()

}

編譯執行

知識點分析

**分析

這個程式中的兩個子程序都屬於乙個程序組,使用命令列 kill -9 -程序組id 可以同時殺死此程序組中的所有子程序。

從例項中理解框架

目前,各種開發框架非常流行,那麼,什麼是框架 framework 框架是如何產生的?為什麼要使用框架,以及使用框架能給我們的開發帶來什麼樣的好處呢?下面就以我們熟悉的web框架為基礎來加深對框架的理解。在不使用struts或者springmvc等web層框架時,一直是由servlet完成業務邏輯的實...

深入理解csrf(flask例項)

看了好多csrf的介紹,大概意思是 在a 登入了,儲存了cookie,在此期間訪問了b b站裡面使用可以跨域的標籤比如src,來直接呼叫a站重要介面 例如轉賬 直接完成轉賬 之前一直不理解,為什麼訪問 b的時候 會帶著a的登入資訊 cookie 後來想通了,flask實驗如下 危險 b flask模...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...