原共有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操作記憶體 在指標宣告時,號表示所宣告的變數為指...