簡體   English   中英

創建沒有 fork() 的子進程

[英]Creating a child process WITHOUT fork()

有沒有辦法在沒有fork()的情況下僅使用execvp()來啟動子進程?

對你的問題的迂腐回答是否定的。 創建新進程的唯一系統調用是fork execvp底層的系統調用(稱為execve )將新程序加載到現有進程中,這是另一回事。

除了fork之外,某些種類的 Unix 具有創建新進程的額外系統調用(例如vforkrforkclone ),但它們只是fork本身的微小變化,它們都不是 POSIX 標准的一部分,該標准指定了您可以使用的功能指望任何自稱是 Unix 的東西

稍微有用的答案是您可能正在尋找posix_spawn ,它是一個庫例程,將forkexec包裝成單個操作,但我發現正確使用它比編寫我自己的fork + exec子例程麻煩。 天啊。

與 Windows 系統不同,在 Windows 系統中,創建新進程和執行新進程映像在一個步驟中發生,Linux 和其他類似 UNIX 的系統將它們作為兩個不同的步驟來執行。

fork函數完全復制了調用進程並實際返回了兩次,一次返回到父進程,一次返回到子進程。 execvp函數(以及exec系列中的其他函數)在同一進程中執行新進程映像,覆蓋現有進程映像。

您可以調用execvp而無需先調用fork 如果是這樣,那僅意味着當前運行的程序消失並被給定的程序替換。 然而, fork是創建一個新的進程的方式

posix_spawn是唯一一種無需直接調用fork即可創建子進程的 posix 兼容方式。 我說“直接”是因為歷史上posix_spawn本身只會調用forkvfork 但是,在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM