Linux下程序終止過程

2021-06-22 10:19:25 字數 1467 閱讀 7656

無論是在什麼系統中,當程序終止之後,系統都需要釋放程序占有的資源。否則,系統資源會被耗盡。下面將詳細說明linux系統中,程序終止的過程。

linux的程序終止方式有8種,其中5種是正常終止,分別是:

從main函式返回。

呼叫exit函式。

呼叫_exit或_exit。

最後乙個執行緒從其啟動例程返回。

最後乙個執行緒呼叫pthread_exit。

異常終止有3種,分別是:

呼叫abort函式。

接收到訊號並終止。

最後乙個執行緒對取消請求做出響應。

linux中,對於資源的釋放,採取的是「誰申請誰釋放」的原則。比如,程序自身申請的訊號量、檔案描述符等,需要程序自己釋放。而程序描述符、核心棧這些資源則需要父程序來**。

不管程序以何種方式終止,最終都會呼叫do_exit()函式。do_exit()函式是程序的析構函式。借用一張網上的圖,表示如下:

do_exit()函式主要完成下列工作:

將task_struct(核心中表示程序的資料結構)中的標誌成員設定為pf_exiting。

呼叫del_timer_sync()刪除任一核心定時器。

如果bsd的程序記賬功能是開啟的,呼叫acct_update_integrals()輸出記賬資訊。

呼叫exit_mm()函式,釋放程序占有的mm_struct。

呼叫sem_exit()函式,釋放程序的訊號量。

呼叫exit_files()和exit_fs(),分別遞減檔案描述符和檔案系統資料的引用計數。

把存放task_struct的exit_code成員中的任務退出碼置為exit()提供的退出碼。

呼叫exit_notify()向父程序發訊號,給子程序重新找父程序,新的父程序為程序組中其他程序或者init程序。並把程序狀態置為exit_zombie。

do_exit()呼叫schedule()切換到新的程序。因為處於exit_zombie狀態的程序不會再被排程,所以這是程序執行的最後一段**。

執行完上述操作之後,程序相關聯的資源都被釋放掉,並處於exit_zombie狀態。但是程序的核心棧、thread_info(指向task_struct的資料結構)和task_struct。此時程序存在的唯一目的就是向父程序提供資訊,父程序釋放子程序占用的剩餘記憶體。

當乙個程序終止之後,核心會向其父程序傳送sigchld訊號(何時發?)。父程序在sigchld的訊號處理函式中呼叫wait()函式,獲得已終結的子程序資訊後,呼叫release_task()函式,釋放其占用的剩餘資源。

如果父程序建立了子程序,但是又不想負責**子程序占用的資源,可以使用兩次fork的方法:

父程序建立乙個子程序,子程序再建立孫程序執行需要執行的操作,然後子程序退出。

由於子程序退出了,那麼孫程序將會被init程序託管,所以其資源的**也將由系統來負責。

Pthread Linux程序終止過程

程序終止過程 程序終止的系統呼叫sys exit 通過函式do exit 實現。do exit 呼叫 static inline void exit mm struct task struct tsk 釋放一部分資源。然後呼叫 static void exit notify void 通知父程序和子...

Linux 程序建立 程序終止

程序終止 fork 在linux中fork函式時非常重要的函式,它從已存在程序中建立乙個新程序。新程序為子程序,而原程序為父程序。include pid t fork void 返回值 自程序中返回0,父程序返回子程序id,出錯返回 1子程序複製父程序的pcb,因此複製了父程序的程式計數器,所以和父...

Linux程序終止訊號

sigterm 該訊號可由程序捕獲,使用該訊號讓程序有機會在退出之前做好清理工作,從而優雅地終止。sigint 當使用者按下中斷鍵 一般採用delete或ctrl c 時,終端驅動程式產生此訊號並傳送至前台程序組中的每乙個程序。sigkill 該訊號不能被程序捕捉和忽略,它向系統管理員提供了一種可靠...