【linux學習指南】進程創建與終止

加粗樣式

【linux學習指南】進程創建與終止

?進程創建? fork函數初識

linux中fork函數是?常重要的函數,它從已存在進程中創建?個新進程。新進程為?進程,?原進程為?進程。

代碼語言:JavaScript代碼運行次數:0運行復制

 #include <unistd.h> pid_t fork(void);返回值:?進程中返回0,?進程返回?進程id,出錯返回-1

進程調?fork,當控制轉移到內核中的fork代碼后,內核做:

分配新的內存塊和內核數據結構給?進程將?進程部分數據結構內容拷???進程添加?進程到系統進程列表當中fork返回,開始調度器調度

【linux學習指南】進程創建與終止

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

【linux學習指南】進程創建與終止

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

【linux學習指南】進程創建與終止

所以,fork之前?進程獨?執?,fork之后,??兩個執?流分別執?。注意,fork之后,誰先執?完 全由調度器決定。

?fork函數返回值?進程返回0?進程返回的是?進程的pid。? 寫時拷?

通常,??代碼共享,??再不寫?時,數據也是共享的,當任意??試圖寫?,便以寫時拷?的?式各??份副本。具體?下圖:

【linux學習指南】進程創建與終止

因為有寫時拷?技術的存在,所以??進程得以徹底分離離!完成了進程獨?性的技術保證!

寫時拷?,是?種延時申請技術,可以提?整機內存的使?率

?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

【linux學習指南】進程創建與終止

實例:

代碼語言: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的參數。

以上就是【

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享