程序的終止和等待

2021-08-17 11:46:17 字數 2144 閱讀 4663

程序終止

一般來說,程序的退出場景有以下三種:

**執行完畢,結果正確

**執行完畢,結果錯誤

**異常終止

常見的退出方法:

從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定義的程序的終止狀...