加粗樣式

?進程創建? fork函數初識
在linux中fork函數是?常重要的函數,它從已存在進程中創建?個新進程。新進程為?進程,?原進程為?進程。
代碼語言:JavaScript代碼運行次數:0運行復制
#include <unistd.h> pid_t fork(void);返回值:?進程中返回0,?進程返回?進程id,出錯返回-1
進程調?fork,當控制轉移到內核中的fork代碼后,內核做:
分配新的內存塊和內核數據結構給?進程將?進程部分數據結構內容拷???進程添加?進程到系統進程列表當中fork返回,開始調度器調度

當?個進程調?fork之后,就有兩個?進制代碼相同的進程。?且它們都運?到相同的地?。但每個進程都將可以開始它們??的旅程,看如下程序。

這?看到了三?輸出,??before,兩?after。進程43676先打印before消息,然后它有打印after。 另?個after消息有1398691打印的。注意到進程1398691沒有打印before,為什么呢?如下圖所?

所以,fork之前?進程獨?執?,fork之后,??兩個執?流分別執?。注意,fork之后,誰先執?完 全由調度器決定。
?fork函數返回值?進程返回0?進程返回的是?進程的pid。? 寫時拷?
通常,??代碼共享,??再不寫?時,數據也是共享的,當任意??試圖寫?,便以寫時拷?的?式各??份副本。具體?下圖:

因為有寫時拷?技術的存在,所以??進程得以徹底分離離!完成了進程獨?性的技術保證!
寫時拷?,是?種延時申請技術,可以提?整機內存的使?率
?fork常規?法?個?進程希望復制??,使??進程同時執?不同的代碼段。例如,?進程等待客?端請求,?成?進程來處理請求。?個進程要執??個不同的程序。例如?進程從fork返回后,調?exec函數。?fork調?失敗的原因系統中有太多的進程實際??的進程數超過了限制?進程終?
進程終?的本質是釋放系統資源,就是釋放進程申請的相關內核數據結構和對應的數據和代碼。
?進程退出場景代碼運?完畢,結果正確代碼運?完畢,結果不正確代碼異常終??進程常?退出?法
正常終?(可以通過 echo $? 查看進程退出碼):
從main返回調?exit_exit
異常退出:
ctrl+c 信號終??退出碼
退出碼(退出狀態)可以告訴我們最后一次執行的命令的狀態。在命令結束以后,我們可以知道命令是成功完成的還是以錯誤結束的。其基本思想是,程序返回退出代碼0時表示執行成功,沒有問題。
代碼1或 0以外的任何代碼都被視為不成功。
linux Shell 中的主要退出碼 :
退出碼
解釋
0
命令成功執行
1
通用錯誤代碼
2
命令(或參數)使用不當
126
權限被拒絕(或)無法執行
127
未找到命令,或PATH錯誤
128 + n
命令被信號從外部終止,或遇到致命錯誤
130
通過Ctrl + C或SIGint終止(終止代碼2或鍵盤中斷)
143
通過SIGTERM終止(默認終止)
255/ *
退出碼超過了0 – 255的范圍,因此重新計算(LC3TT注:超過255后,用退出碼取模)
退出碼0表示命令執行無誤,這是完成命令的理想狀態。退出碼1我們也可以將其解釋為“不被允許的操作”。例如在沒有sudo權限的情況下使用yum;再例如除以0等操作也會返回錯誤碼1,對應的命令為let a=1/ 0130 (SIGINT]或^c))和143([SIGTERM))等終止信號是非常典型的,它們屬于128+n信號,其中n代表終止碼。可以使用strerror函數來獲取退出碼對應的描述。?_exit函數代碼語言:javascript代碼運行次數:0運行復制
#include <unistd.h> void _exit(int status);參數:status 定義了進程的終?狀態,?進程通過wait來獲取該值
說明:雖然status是int,但是僅有低8位可以被?進程所?。所以_exit(-1)時,在終端執?$?發現返回值是255。
?exit函數代碼語言:javascript代碼運行次數:0運行復制
#include <unistd.h> void exit(int status);
exit最后也會調?_exit,但在調?_exit之前,還做了其他?作:
執???通過atexit或on_exit定義的清理函數。關閉所有打開的流,所有的緩存數據均被寫?調?_exit

實例:
代碼語言:javascript代碼運行次數:0運行復制
int main(){ printf("hello"); exit(0);}運?結果: [root @localhost linux] #./a.outhello[root @localhost linux]#int main(){ printf("hello"); _exit(0);}運?結果: [root @localhost linux] #./a.out[root @localhost linux] #
?return退出
return是?種更常?的退出進程?法。執?returnn等同于執?exit(n),因為調?main的運?時函數會將main的返回值當做exit的參數。