linux程序管理(2)

2021-09-30 16:25:57 字數 1600 閱讀 3896

程序家族樹

在task_struct資料結構中,我們可以通過parent和children等域,如獲得當前程序的父程序:

struct task_struct *my_parent = current->parent

而在linux系統中,如前面所述,是儲存在乙個雙向鍊錶中的,所以可以通過以下方法獲得前乙個程序:

list_entry(task->tasks.next,struct task_struct, task)

同樣可以通過next_task(task)和prev_task(task)這兩個巨集實現對前乙個程序和後乙個程序的獲取,而實際上,for_each_process(task)巨集提供了依次訪問整個任務佇列的功能,如

struct task_struct *task

for_each_process(task)

程序的建立

如前面提到的,linux系統中通過fork()函式實現程序的建立。linux的fork()使用寫時拷貝頁實現。核心其實並不拷貝整個程序的位址空間,而是讓父程序和子程序共享乙個拷貝。只有在需要寫入時,資料才會被複製,從而使各個程序擁有各自的拷貝。

linux通過clone()系統呼叫實現fork()。fork()、vfork()和__clone()庫函式都根據各自需要的引數標誌去呼叫clone()。然後clone()去呼叫do_fork()。do_fork()完成程序建立的大部分工作,其定義見kernel/fork.h。該函式呼叫了copy_process()函式。而copy_process()是建立程序的主要函式:

1、呼叫dup_task_struct()函式為新程序建立乙個核心棧、thread_info結構和task_struct,這些值與當前的程序的值相同。

2、 子程序的狀態被設定為task_uninterruptible以保證它不會被投入執行。

3、 copy_process()呼叫copy_flags()函式,以更新task_struct的flags成員。表明程序是否擁有超級使用者許可權的pf_superpriv標誌被清0, 表明程序還沒有呼叫exec()函式的pf_forknoexe標誌被設定。

4、 呼叫get_pid()為新程序獲取乙個pid.

5、 根據傳遞給clone()函式的引數,copy_process()拷貝或者共享開啟的檔案、檔案系統資訊、訊號處理函式、程序位址空間和命名空間等。

6、 讓父程序和子程序平分剩餘的時間片。

7、 copy_process()返回乙個指向子程序的指標。

vfork()函式和fork()基本相同,所不同的是不拷貝父程序頁表項。vfork()系統呼叫的實現是通過向clone()系統呼叫傳遞乙個特殊標誌來進行:

1、在呼叫copy_process()函式時,task_struct的vfork_done被置為null

2、 在執行do_fork()函式時,如果給定特別標誌,則vfork()會指向乙個特殊位址。

3、 子程序開始執行後,父程序不是馬上恢復執行,而是一直等待子程序通過vfork_done指標向它傳送訊號。

4、 在呼叫mm_release()時,該函式用於程序退出記憶體位址空間,並檢查vfork_done是否為空,如果不為空,則向父程序傳送訊號。

linux程序管理2

1.後台執行作業 root lly sleep 100 2 5611 root lly sleep 1000 3 5612 root lly ps ef grep sleep root 5608 5577013 32 pts 000 00 00 sleep 1000 root 5611 557701...

Linux 程序管理(2)top

動態檢視程序top,就像windows的任務管理器。top 回車,立刻重新整理 按z色彩顯示,按f通過游標設定列的順序。top d 1 每1秒重新整理。top d 1 p 10126 檢視指定程序 10126 的動態資訊。top d 1 p 10126,1 檢視10126和1的動態資訊。給程序傳送訊...

實驗2 Linux程序管理

列印當前所有環境變數的值 新增新的環境變數newenv first 修改環境變數newenv的值為second 列印環境變數newenv的值。include include include include extern char environ intmain putenv newenv first...