天天看點

Linux程序實踐(3) --程序終止與exec函數族

(1)正常退出

   從main函數傳回[return]

   調用exit

   調用_exit/_Exit

(2)異常退出

   調用abort   産生SIGABOUT信号

   由信号終止  Ctrl+C [SIGINT]

   ...(并不完全, 如return/pthread_exit等)

測試[exit/_exit]

Linux程式實踐(3) --程式終止與exec函數族
Linux程式實踐(3) --程式終止與exec函數族

由圖可知,系統調用_exit直接陷入核心,而C語言庫函數是經過一系列的系統清理工作,再調用Linux核心的;

小結:exit與_exit差別

   1)_exit是一個系統調用,exit是一個c庫函數

   2)exit會執行清除I/O緩存

   3)exit會執行調用終止處理程式 //終止處理程式如下

終止處理程式:atexit

Linux程式實踐(3) --程式終止與exec函數族

異常終止

Linux程式實踐(3) --程式終止與exec函數族

exec替換程序印象

   在程序的建立上,Unix采用了一個獨特的方法,它将程序建立與加載一個新程序映象分離。這樣的好處是有更多的餘地對兩種操作進行管理。

   當我們建立了一個程序之後,通常将子程序替換成新的程序映象,這可以用exec系列的函數來進行。當然,exec系列的函數也可以将目前程序替換掉。

   exec隻是用磁盤上的一個新程式替換了目前程序的正文段, 資料段, 堆段和棧段.

函數族資訊

說明:

   execl,execlp,execle(都帶“l”, 代表list)的參數個數是可變的,參數以必須一個空指針結束。

   execv和execvp的第二個參數是一個字元串數組(“v”代表“vector”,字元串數組必須以NULL結尾),新程式在啟動時會把在argv數組中給定的參數傳遞到main。

   名字最後一個字母是“p”的函數會搜尋PATH環境變量去查找新程式的可執行檔案。如果可執行檔案不在PATH定義的路徑上,就必須把包括子目錄在内的絕對檔案名做為一個參數傳遞給這些函數;

/*總結:l代表可變參數清單,p代表在path環境變量中搜尋file檔案。envp代表環境變量*/

Linux程式實踐(3) --程式終止與exec函數族

  system()函數調用“/bin/sh -c command”執行特定的指令,阻塞目前程序直到command指令執行完畢,system函數執行時,會調用fork、execve、waitpid等函數。

原型:

傳回值:

    如果無法啟動shell運作指令,system将傳回127;出現不能執行system調用的其他錯誤時傳回-1。如果system能夠順利執行,傳回那個指令的退出碼。

自己動手寫system

Linux程式實踐(3) --程式終止與exec函數族

繼續閱讀