程序終止
一般來說,程序的退出場景有以下三種:
**執行完畢,結果正確
**執行完畢,結果錯誤
**異常終止
常見的退出方法:
從main函式返回
呼叫exit
呼叫_exit
在linux學習的過程中,我們常用 ctrl+c來終止我們執行的程式,這就是異常終止
_exit函式
#includevoid _exit(int status);
//status定義為程序的終止狀態,父程序通過wait來獲取這個值
雖然status是int,但僅有低八位可以被父程序所用,所以_exit(-1)時,在終端執行$?發現返回值是255
exit函式
#includevoid exit(int status);
我們需要明確一點,在任何地方,一旦呼叫exit函式,則當前程序就會退出。
exit函式最後也會呼叫_exit函式,但是在呼叫之前,還需要做另外的一些工作:
執行使用者通過atexit或者on_exit定義的清理函式
關閉所有開啟的流,所有的快取資料均被寫入
呼叫_exit
測試**:
一
#include#includeint main()
二
#include#includeint main()
return退出
return是一種更常見的退出程序方式,執行return n等同於執行exit(n),因為呼叫main的函式執行時會將main的返回值當做exit的引數。
程序等待
程序等待的必要性
子程序退出,如果父程序不進行**,就可能造成殭屍程序的問題,進而造成記憶體洩漏
程序一旦變為殭屍程序,則無法殺死,連kill -9命令也無能為力
父程序需要知道子程序的任務的最終執行結果
父程序需要通過程序等待的方式,**子程序資源,獲取子程序退出資訊
程序等待的方法一:wait方法
#include#includepid_t wait(int *status)
返回值:成功返回被等待程序的pid,失敗返回 -1 。
引數:輸出型引數,獲取子程序退出狀態,不關心則可以設定成null 。
二:waitpid方法
pid_t waitpid(pid_t pid,int *status,int options);
返回值:
1-> 正常返回時返**集到的子程序的id。
2-> 如果設定了選項wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返回0。
3-> 如果呼叫中出錯,則返回 -1 。這時errno會被設定成相應的值以指示錯誤所在。
引數:
pid-> pid為-1時,等待任乙個子程序,與wait等效
status->
wifexited(status):若為正常終止子程序返回的狀態,則為真(檢視程序是否是正常退出),
wexitstatus(status):若wifexited非零,提取子程序退出碼,(檢視程序的退出碼)。
options->
wnohang:若pid指定的子程序沒有結束,則waitpid()函式返回0,不予以等待,若正常結束,則返回該子程序的id。
若子程序已經退出,呼叫wait/waitpid時會立即返回並且釋放資源,獲得子程序退出資訊
若在任意時刻呼叫wait/waitpid,子程序存在且正常執行,則程序可能阻塞
如果不存在該子程序,則立即出錯返回
程序建立,終止,等待
今天我們來說一說程序的建立,終止,等待。1 程序的建立 建立乙個程序我們用到的函式是fork函式,它從已存在的程序中建立乙個新的程序,新程序為子程序,而原程序為父程序。fork函式 include pid t fork void 子程序返回0,父程序返回子程序的id,出錯返回 1。值得注意的是,父程...
程序建立,程序等待,程序終止
1 程序建立,2 程序等待,3 程序終止 程序建立被定義為通過父程序建立子程序的過程。fork函式 函式原型 pid t fork void 特點 1.fork函式呼叫一次,返回兩次兩次返回值得區別分別是子程序當中的返回值為0,父程序當中的返回值為新建子程序的id 將id返回給父程序的原因是沒有函式...
作業系統 程序終止,程序等待
程序終止 退出的幾種場景 執行結束,結果正確 執行結束,結果不正確 異常終止 程序常見的退出方法 正常終止 從main返回 呼叫exit exit 異常終止 注意exit 和 exit的區別 exit函式 include void exit int status 引數 status定義的程序的終止狀...