進程退出分為正常退出和異常退出兩種:
(1)正常退出
a.在main函數中執行return
b.調用exit函數
c.調用_exit函數
(2)異常退出
a.調用about函數。
b.進程受到某個信號,而該信號使程序終止。
總結:不管是那種退出方式,最終都會執行內核中的同一段代碼。這段代碼用來關閉進程中所有打開的文件描述符,釋放它所占用的內存和其他資源。
退出方式比較:
a.exit和return的區別:exit是一個函數,有參數;而return是函數執行完後的返回。exit把控制權交給系統,而return將控制權交給調用函數。
b.exit和abort的區別:exit是正常終止進程,而about是異常終止。
c.exit(int exit_cod):exit中的參數exit_code為0代表進程正常終止,若為其他值表示程序執行過程中有錯誤發生,比如溢出,除數為0。
d.exit()和_exit()的區別:exit頭文件stdlib.h中聲明,而_exit()聲明在頭文件unistd.h中。兩個函數均能正常終止進程,但是_exit()會執行後立即返回給內核,而exit()要先執行一些清除操作,然後將控制權交給內核。
父子進程終止的先後順序不同會產生不同的結果。在子進程退出前父進程退出,則系統會讓init進程接管子進程。當子進程先於父進程終止,而父進程又沒有調用wait函數等待子進程結束,子進程進入僵死狀態,並且會一直保持下去除非系統重啟。子進程處於僵死狀態是,內核只保存該進程的一些必要信息以備父進程所需。此時子進程始終占用著資源,同時也減少了系統可以創建的最大進程數。如果子進程先於父進程終止,且父進程調用了wait或waitpid函數,則父進程會等待子進程結束。