[英]Creating a child process WITHOUT fork()
有沒有辦法在沒有fork()
的情況下僅使用execvp()
來啟動子進程?
對你的問題的迂腐回答是否定的。 創建新進程的唯一系統調用是fork
。 execvp
底層的系統調用(稱為execve
)將新程序加載到現有進程中,這是另一回事。
除了fork
之外,某些種類的 Unix 具有創建新進程的額外系統調用(例如vfork
、 rfork
、 clone
),但它們只是fork
本身的微小變化,它們都不是 POSIX 標准的一部分,該標准指定了您可以使用的功能指望任何自稱是 Unix 的東西。
稍微有用的答案是您可能正在尋找posix_spawn
,它是一個庫例程,將fork
和exec
包裝成單個操作,但我發現正確使用它比編寫我自己的fork
+ exec
子例程更麻煩。 天啊。
與 Windows 系統不同,在 Windows 系統中,創建新進程和執行新進程映像在一個步驟中發生,Linux 和其他類似 UNIX 的系統將它們作為兩個不同的步驟來執行。
fork
函數完全復制了調用進程並實際返回了兩次,一次返回到父進程,一次返回到子進程。 execvp
函數(以及exec
系列中的其他函數)在同一進程中執行新進程映像,覆蓋現有進程映像。
您可以調用execvp
而無需先調用fork
。 如果是這樣,那僅意味着當前運行的程序消失並被給定的程序替換。 然而, fork
是創建一個新的進程的方式。
posix_spawn是唯一一種無需直接調用fork
即可創建子進程的 posix 兼容方式。 我說“直接”是因為歷史上posix_spawn
本身只會調用fork
或vfork
。 但是,在 GNU/linux 中不再是這種情況。 posix_spawn
本身可能比fork
更有效,此外在代碼嘗試運行不同的可執行文件時可能在概念上更適合。
如果您不擔心可移植性,您可以放棄 posix 並將自己直接連接到您所針對的內核。 在 linux 上,創建子進程的系統調用是clone 。 在回答這個問題時,手冊頁提供了三種變體的文檔,包括相對較新的clone3
。
我相信您可以從手冊頁中獲取示例並向childFunc
添加execvp
調用。 不過我還沒試過!
正如用戶 zwol 已經解釋的那樣, execve()
不會分叉新進程。 相反,它替換當前進程的地址空間和 CPU 狀態,從可執行文件名加載新地址空間,並從main()
啟動它,參數列表argv
和環境變量列表envp
。 它保留pid和打開的文件。
int execve(const char *filename,char *const argv [],char *const envp[]);
filename
: 要運行的可執行文件的名稱
argv
: 命令行參數
envp
:環境變量設置(例如, $PATH
、 $HOME
等)
posix_spawn。 但它忽略了 execvp() 的失敗——可能是因為實現它被認為太復雜了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.