跳轉到內容

C 程式設計/POSIX 參考/spawn

來自華夏公益教科書,開放的書籍,為開放的世界

Spawn 指的是一個載入並 執行 新的 子程序 的函式。 當前程序 可能會或可能不會繼續非同步執行。建立一個新的子程序需要足夠的記憶體,以便子程序和當前程式都可以執行。

Microsoft Windows 作業系統系列中有一組 spawn 函式。 在 POSIX 標準 [1] 的可選擴充套件中也有一組不同的 spawn 函式。

不同的版本

[edit | edit source]

Microsoft Windows 的 spawn 函式受到 Unix 函式 forkexec 的啟發;然而,由於 Windows 不支援 fork(至少在 Win32 API 中; POSIX 模擬環境,如 CygwinSFU 確實支援),spawn 函式作為 fork-exec 組合的替代品提供。然而,spawn 函式雖然能夠充分處理最常見的用例,但它缺少 fork-exec 的全部功能,因為在 fork 之後,任何將在 exec 後保留的程序設定都可以更改。然而,在大多數情況下,可以透過使用更低階的 CreateProcess API 來彌補這種缺陷。

Posix spawn 函式的引入是為了在不支援交換或動態地址轉換的嵌入式環境的 Posix 實現中支援程序 [2]

Microsoft Windows spawn 函式

[edit | edit source]

spawnlspawnlpspawnvspawnvp 呼叫中,子程序繼承父程序的環境。在進行 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 引數指定要執行的程式的檔名。對於 spawnlpspawnvp,如果檔名沒有路徑且不在當前目錄中,則 PATH 環境變數 將決定要搜尋檔案的目錄。argv[0] 指向的字串是要執行的程式的名稱。

傳遞給 spawned 程式的命令列由 spawn 呼叫中的字元字串 arg0argn 組成。這些字串的接受的最大組合長度在不同的編譯器之間有所不同,從 Digital Mars 上的 128 個字元 [3] 到 Microsoft Visual C++ 上的 1024 個字元 [4],或者在 DJGPP 上允許的儘可能多的記憶體 [5]。argn 之後的最後一個引數必須是 NULL 指標。

argv 引數是一個字元指標陣列。陣列中的最後一個指標必須為空,以指示列表的結尾。

spawnlespawnlpespawnvespawnvpe 呼叫允許使用者透過在 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 擴充套件)

另請參閱

[編輯 | 編輯原始碼]

參考文獻

[編輯 | 編輯原始碼]
華夏公益教科書