1. 程式人生 > >SylixOS 用戶進程加載淺析

SylixOS 用戶進程加載淺析

絕對路徑 內部命令 argv 方便 tar pro 函數 以及 編寫

目 錄

  1. Exec的由來... 1

  2. SylixOS下的exec函數族... 1

  3. 總結... 1

  4. 參考資料... 1

  5. Exec的由來

當時系統設計的初期,好多人都采用過“if-else if”的方式來實現一些內部命令,但是用這種“if-else if”的結構的前提是系統的創建者需要能夠提前預知用戶所要鍵入的命令,換句話說,其實是創建者限制了用戶鍵入命令的種類。如果都按照這樣的方式添加新命令,豈不是當系統每次支持一個新命令的時候都要重新編譯一次shell。

同時更為嚴重的問題是,如果是外部命令,都是存儲在文件系統上的外部程序,程序名的命名是自由的,如果仍然采用“if-else if”的結構,用戶根本無法正常執行一個外部命令,於是為了解決這個問題,exec應運而生,exec會把一個可執行文件的絕對路徑作為參數,把當前正在運行的用戶進程的進程體用該可執行文件的進程體替換,從而完成新程序的執行,由於其實現原理是新進程替換老進程,所以新執行的進程的pid仍是老進程的pid。

  1. SylixOS下的exec函數族

SylixOS向用戶提供的exec函數族中共有7種:

#include <process.h>

int execl(const char path, const char argv0, ...);

int execle(const char path, const char argv0, ...);

int execlp(const char file, const char argv0, ...);

int execv(const char path, char const *argv);

int execve(const char path, char

const argv, char const *envp);

int execvp(const char file, char const *argv);

int execvpe(const char file, char const argv, char const *envp);

這七個函數實現的功能是類似的,都是將當前進程映像替換成新的程序文件。其差別在於程序對象的表示方式以及是否傳入環境變量,其中參數path表示是可執行文件的絕對路徑,參數file表示可執行程序的程序名,而具體的路徑將從shell的全局變量$PATH中指定的路徑中搜索。

其中只有execve和execvpe屬於正真意義上的系統調用,其它都是在此基礎上經過包裝的庫函數。

  1. 總結

SylixOS為用戶提供了一套POSIX兼容API, 其中包括了exec函數族,用戶可以方便地編寫 SylixOS 程序或移植程序到SylixOS。

  1. 參考資料

《SylixOS應用程序開發手冊》

《操作系統發展史》

SylixOS 用戶進程加載淺析