在linux
中,程序的建立由系統呼叫fork
和vfork
完成。它們生成乙個子程序並且子程序是父程序的乙個複製品。
fork
系統呼叫對應的kernel
函式是sys_fork
,此函式簡單的呼叫kernel
函式do_fork
。乙個簡化版的do_fork
執行如下:
(1)alloc_pid()
。給新的程序分配乙個新的pid
,即程序號
(2)copy_process()
此函式會做fork
的大部分事情,它主要完成講父程序的執行環境複製到新的子程序,比如訊號處理、檔案描述符和程序的**資料等。
(3)wake_up_new_task()
。計算此程序的優先順序和其他排程引數,將新的程序加入到程序排程佇列並設此程序為可被排程的,以後這個程序可以被程序排程模組排程執行。
簡化的copy_process()
流程:
(1)dup_task_struct()
。分配乙個新的程序控制塊,包括新程序在kernel
中的堆疊。新的程序控制塊會複製父程序的程序控制塊,但是因為每個程序都有乙個kernel
堆疊,新程序的堆疊將被設定成新分配的堆疊。
(2)初始化一些新程序的統計資訊,如此程序的執行時間
(3)copy_semundo()
複製父程序的semaphore undo_list
到子程序。
(4)copy_files()
、copy_fs()
。複製父程序檔案系統相關的環境到子程序
(5)copy_sighand()
、copy_signal()
。複製父程序訊號處理相關的環境到子程序。
(6)copy_mm()
(7)copy_thread()
。設定子程序的執行環境,如子程序執行時各cpu
暫存器的值、子程序的kernel
棧的起始位址。
(8)sched_fork()
。設定子程序排程相關的引數,即子程序的執行cpu
、初始時間片長度和靜態優先順序等。
(9)將子程序加入到全域性的程序佇列中
(10)
設定子程序的程序組id
和對話期id等。
簡單的說,copy_process()
就是將父程序的執行環境複製到子程序並對某些子程序特定的環境做相應的調整。
應用程式使用系統呼叫exit()
來結束乙個程序,此系統呼叫接受乙個退出原因**,父程序可以使用wait()
系統呼叫來獲取此**,從而知道子程序退出的原因。對應到kernel
,此系統呼叫sys_exit_group()
,它的基本流程如下:
(1)將訊號sigkill
加入到其他執行緒的訊號佇列中,並喚醒這些執行緒。
(2)此執行緒執行do_exit()
來退出。
do_exit()
完成執行緒退出的任務,其主要功能是將執行緒占用的系統資源釋放,do_exit()
的基本流程如下:
(1)將程序記憶體管理相關的資源釋放
(2)將程序icp semaphore
相關資源釋放
(3)__exit_files()
、__exit_fs()
。將程序檔案管理相關的資源釋放。
(4)exit_thread()
。只要目的是釋放平台相關的一些資源。
(5)exit_notify()
。在linux
中程序退出時要將其退出的原因告訴父程序,父程序呼叫wait()
系統呼叫後會在乙個等待佇列上睡眠。
(6)schedule()
。呼叫程序排程器,因為此程序已經退出,切換到其他程序。
Linux程序的建立和終結
linux建立程序很複雜,首先呼叫fork 最終呼叫do fork 而do fork 呼叫copy process 首先是copy process 的一系列工作 1.複製父程序。呼叫dup task struct 此時子程序與父程序描述符完全相同。2.把程序描述符中的各項設為0或者初始值,並把程序狀...
linux結束程序
linux結束程序 linux沿用unix進行程序間通訊的方法,程序之間通過訊號來通訊。程序的訊號是預定義好的乙個訊息,程序能識別它並決定進行忽略還 是作出反應。開發人員實現程式如何處理訊號。多數好的程序都支援的訊號 1 hup 掛起訊號 2 int 中斷訊號 3 quit 結束執行訊號 9 kil...
程序建立和執行
簡單的說,每個應用在執行時就會產生乙個程序,這個程序就對這個應用負責,掌握這個應用的執行狀態。可是為什麼還要用乙個程序來控制乙個應用呢,下面將會簡單的解釋一下。現在的應用對於資源的要求都是獅子大開口,開口就是幾個g,一台電腦的記憶體一般也就幾個g,總不能一台電腦就跑這乙個應用吧。為了解決這個問題,作...