程序通過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值,數值大,表示較少...