Linux 程序管理

2022-07-11 00:24:10 字數 2259 閱讀 7706

程序通過fork()建立的大致過程:

#include #include #include #include extern int create_process(char* program, char** arg_list);

int create_process(char* program, char** arg_list)else

}

概覽圖:

這裡編譯出的.o檔案,就是elf的第一種型別,可重定位檔案,格式如下:

在程式中我們提到過函式棧,區域性變數是放在裡的,在執行期隨時分配、隨時釋放。這裡討論的是檔案,還沒到執行階段。

如要將函式作為庫檔案被重用,不能以.o的形式存在,而是要形成庫檔案,最簡單的型別是靜態鏈結庫.a檔案。

ar cr libstaticprocess.a process.o

# 形成二進位制執行檔案staticcreateprocess

gcc -o staticcreateprocess createprocess.o -l. -lstaticprocess

上述第二條命令鏈結時,createprocess.o呼叫了create_process函式,但不知道位置,通過將process.o合併進來,就可以確定位置了。這裡形成了elf的第二種格式:

.o相似,檔案被分為多個section,通過節頭表來描述。這裡除了段描述之外,最重要的是p_vaddr——載入到記憶體的虛擬位址。

靜態庫特點:

當動態鏈結庫被鏈結到乙個程式檔案時,最後的程式檔案並不包括動態鏈結庫中的**,而僅僅包括對動態鏈結庫的引用,並且不儲存動態鏈結庫的全路徑,僅儲存其名稱

gcc -shared -fpic -o libdynamicprocess.so process.o

gcc -o dynamiccreateprocess createprocess.o -l. -ldynamicprocess

執行此程式時,先尋找動態鏈結庫,再進行載入。預設,系統在/lib/usr/lib路徑下尋找,找不到則報錯。可以通過設定ld_library_path環境變數,指定動態鏈結庫的路勁。

動態鏈結庫,就是elf的第三種型別,共享物件檔案

接下來,我們來看下程式執行時,是如何將so檔案動態鏈結到程序空間的?

elf二進位制檔案是如何載入到記憶體裡的?

static struct linux_binfmt elf_format = ;
具體呼叫鏈:do_execve->do_execveat_common->exec_binprm->search_binary_handler。

在系統呼叫時,exec最終呼叫的是load_elf_binary.

所有程序的祖宗程序,就是系統啟動時的init程序。init程序會啟動很多daemon程序,為系統執行提供服務。然後啟動getty,讓使用者登入,登入後執行shell。

LINUX程序管理

1.程序是什麼?乙個程序就是出於執行期的程式,包括 可執行程式 段 開啟的檔案,掛起的訊號,核心內部資料,處理器狀態,位址空間,乙個或多個執行執行緒,當然還包括用來存放全域性變數的資料段,等等.2.什麼是執行緒?它和程序的關係是什麼樣的?執行緒在linux中具體是怎麼樣實現的?是在程序中活動的物件,...

linux程序管理

程序的監控 使用ps aux 檢視當前所有程序。可以使用top檢視當前程序自動更新列表,在top中m 按記憶體大小排列,p 按cpu佔用率排列 終止和管理程序 程序之間通過訊號來進行通訊 top和kill都用於向程序傳送訊號。kill l顯示訊號編號表。kill 9 pid kill pid 向pi...

Linux 程序管理

1.linux程序管理工具,包括ps pgrep top kill killall pkill 等 常用 ps aux 或lax輸出的解釋 user 程序的屬主 pid 程序的id ppid 父程序 cpu 程序占用的cpu百分比 mem 占用記憶體的百分比 ni 程序的nice值,數值大,表示較少...