C 程式設計/POSIX 參考/spawn
Spawn 指的是一個載入並 執行 新的 子程序 的函式。 當前程序 可能會或可能不會繼續非同步執行。建立一個新的子程序需要足夠的記憶體,以便子程序和當前程式都可以執行。
在 Microsoft Windows 作業系統系列中有一組 spawn 函式。 在 POSIX 標準 [1] 的可選擴充套件中也有一組不同的 spawn 函式。
不同的版本
[edit | edit source]Microsoft Windows 的 spawn 函式受到 Unix 函式 fork 和 exec 的啟發;然而,由於 Windows 不支援 fork(至少在 Win32 API 中; POSIX 模擬環境,如 Cygwin 或 SFU 確實支援),spawn 函式作為 fork-exec 組合的替代品提供。然而,spawn 函式雖然能夠充分處理最常見的用例,但它缺少 fork-exec 的全部功能,因為在 fork 之後,任何將在 exec 後保留的程序設定都可以更改。然而,在大多數情況下,可以透過使用更低階的 CreateProcess API 來彌補這種缺陷。
Posix spawn 函式的引入是為了在不支援交換或動態地址轉換的嵌入式環境的 Posix 實現中支援程序 [2]。
Microsoft Windows spawn 函式
[edit | edit source]在 spawnl、spawnlp、spawnv 和 spawnvp 呼叫中,子程序繼承父程序的環境。在進行 spawn 呼叫時,開啟的檔案將保留在子程序中。
原型
[edit | edit source]int spawnl(int mode, char *path, char *arg0, ...);int spawnle(int mode, char *path, char *arg0, ..., char ** envp);int spawnlp(int mode, char *path, char *arg0, ...);int spawnlpe(int mode, char *path, char *arg0, ..., char ** envp);int spawnv(int mode, char *path, char **argv);int spawnve(int mode, char *path, char **argv, char ** envp);int spawnvp(int mode, char *path, char **argv);int spawnvpe(int mode, char *path, char **argv, char ** envp);
函式名稱
[edit | edit source]每個函式的基名是 spawn,後面跟著一個或多個字母
| 名稱 | 說明 |
|---|---|
| e | 明確地將一個指向環境引數的指標陣列傳遞給子程序。 |
| l | 命令列引數被單獨傳遞給函式。 |
| p | 使用 PATH 環境變數來查詢要執行的檔案。 |
| v | 命令列引數作為指標陣列傳遞給函式。 |
模式
[edit | edit source]mode 引數決定子程序執行的方式。mode 的值是
| 名稱 | 說明 |
|---|---|
| P_OVERLAY | 用子程序覆蓋父程序,這將銷燬父程序。這與 exec* 函式的效果相同。 |
| P_WAIT | 掛起父程序,直到子程序執行完畢(同步 spawn)。 |
| P_NOWAIT, P_NOWAITO | 繼續與新程序併發執行呼叫程序(非同步 spawn)。 |
| P_DETACH | 子程序在後臺執行,沒有訪問控制檯或鍵盤的許可權。對新程序的 _cwait 呼叫將失敗(非同步 spawn) |
路徑
[edit | edit source]path 引數指定要執行的程式的檔名。對於 spawnlp 和 spawnvp,如果檔名沒有路徑且不在當前目錄中,則 PATH 環境變數 將決定要搜尋檔案的目錄。argv[0] 指向的字串是要執行的程式的名稱。
傳遞給 spawned 程式的命令列由 spawn 呼叫中的字元字串 arg0 到 argn 組成。這些字串的接受的最大組合長度在不同的編譯器之間有所不同,從 Digital Mars 上的 128 個字元 [3] 到 Microsoft Visual C++ 上的 1024 個字元 [4],或者在 DJGPP 上允許的儘可能多的記憶體 [5]。argn 之後的最後一個引數必須是 NULL 指標。
argv
[edit | edit source]argv 引數是一個字元指標陣列。陣列中的最後一個指標必須為空,以指示列表的結尾。
envp
[edit | edit source]spawnle、spawnlpe、spawnve 和 spawnvpe 呼叫允許使用者透過在 envp 引數中傳遞環境設定列表來更改子程序的環境。此引數是一個字元指標陣列;每個指標(最後一個指標除外)都指向一個空終止的字串,定義了一個環境變數。環境變數具有以下形式
- name=value
其中 name 是變數名,value 是它的值。陣列中的最後一個指標為空。當 envp 引數為空時,子程序繼承父程序的環境設定。
spawn 函式可以在 Microsoft Windows 下使用。它們使用 LoadModule 執行 spawned 程序。如果失敗,將嘗試 spawn 一個普通的 MS-DOS 程序。如果 spawn 了一個 Windows 應用程式,則可以使用 exec_instancehandleget 獲取例項控制代碼。可以使用 _exec_showset、_exec_showget 和 _exec_showreset 函式指定 spawned 程式的顯示方式。
返回值
[edit | edit source]返回值表示 spawned 程式的退出狀態。值為零表示 spawned 程式成功執行。正值表示 spawned 程式已執行,但被 中止 或以錯誤結束,返回的值是子程序的退出狀態。負值表示 spawned 程式未執行,並且 errno 已設定。在 Microsoft Windows 下,spawn 返回從 LoadModule 返回的負數錯誤程式碼,以與 C 執行時庫相容。可能會遇到以下錯誤程式碼
| 值 | 說明 |
|---|---|
-2 |
檔案未找到 |
-3 |
路徑未找到 |
-11 |
無效的 .exe 檔案(對於 Windows) |
-13 |
DOS 4.0 應用程式 |
-14 |
未知的 .exe 型別(可能是 DOS 擴充套件) |