作業系統 程序終止,程序等待

2021-09-25 21:19:17 字數 2096 閱讀 9277

程序終止

退出的幾種場景

**執行結束,結果正確

**執行結束,結果不正確

**異常終止

程序常見的退出方法

正常終止

從main返回

呼叫exit

_exit

異常終止

注意exit()和_exit的區別

_exit函式

#include void _exit(int status);

//引數:status定義的程序的終止狀態,父程序通過wait來獲取該值

說明:雖然status是int型,但是僅低8位可以用被父程序所用,所以_exit(-1)時,在終端執行$?時,返回值是255

exit函式

#include  void exit(int status);
看圖感受一下:

exit()函式最後也會呼叫exit系統呼叫,但是在這之前,它還會執行使用者定義的清理函式,清除i/o快取

return退出

return是一種更常見的程序退出方法。執行return n就等同於exit(n),因為呼叫main的執行時函式會將main的返回值當做exit的引數

return n的n叫做退出碼,return 0的時候表示**正確,結果正確,當return的數字非0時,說明**執行錯誤,結果不正確,退出碼則表示錯誤的原因

程序等待

程序等待的必要性

子程序退出,父程序如果一直不管,就會造成「殭屍程序」問題,進而導致記憶體洩漏,並且當程序變成「殭屍程序」,就無法再殺死它,連kill -9都沒有用,但是我們需要知道父程序交給子程序的任務完成的如何,結果是否正確,是否正常退出,父程序通過程序等待的方式,**子程序的資源,獲取子程序的退出資訊

實際上,程序等待解決了殭屍程序的問題

程序等待的方法

wait方法

#include #include pid_t wait(int* status)

//返回值:成功:返回被等待程序pid

// 失敗:返回-1

//引數:輸出型引數,獲取子程序退出狀態,不關心則可以設定為null

waitpid方法

pid_t waitpid(pid_t pid, int* status, int options);

/*返回值:當正常返回的時候waitpid返**集到的子程序的程序id

如果程序設定了選項wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返回0

如果呼叫**錯,則返回-1,這時errno會被設定成相應的值以指示錯誤所在

引數:pid:

pid=-1,等待任乙個子程序,與wait等效

pid>0,等待其程序id與pid相等的子程序

status:

wifexited(status):若為正常終止子程序返回的狀態,則為真(檢視程序是否正常退出)

wexitatatus(status):若wifexited非零,提取子程序退出碼(檢視程序的退出碼)

options:

wnohang:若pid指定的子程序沒有結束,則waitpid()函式返回0,不予以等待。若正常結束,則返回該程序id

*/

獲取子程序status

次第八位校驗程序退出碼

低八位判斷是否正常退出

作業系統會把異常情況轉化為訊號

作業系統 程序等待

程序等待的基礎概念程序等待就是為了同步父程序和子程序,如把運算放到子程序,賦值放到父程序,可能需要讓父程序等待子程序運算結束.乙個程序 在終止時會關閉所有的檔案描述符,釋放在使用者空間分配的記憶體,但他的pcb還保留著,核心在其中儲存了一些資訊 如果是正常終 止則儲存著退出狀態,如果是異常退出則儲存...

程序建立,程序等待,程序終止

1 程序建立,2 程序等待,3 程序終止 程序建立被定義為通過父程序建立子程序的過程。fork函式 函式原型 pid t fork void 特點 1.fork函式呼叫一次,返回兩次兩次返回值得區別分別是子程序當中的返回值為0,父程序當中的返回值為新建子程序的id 將id返回給父程序的原因是沒有函式...

程序建立,終止,等待

今天我們來說一說程序的建立,終止,等待。1 程序的建立 建立乙個程序我們用到的函式是fork函式,它從已存在的程序中建立乙個新的程序,新程序為子程序,而原程序為父程序。fork函式 include pid t fork void 子程序返回0,父程序返回子程序的id,出錯返回 1。值得注意的是,父程...