[英]execve with path search?
我想從我的代碼中執行一個程序,並為它提供環境變量和參數。 AFAICT, execve
是正確的選擇。
但是, execve
接收path
參數,而不是filename
,這意味着它期望第一個參數是可執行文件的路徑。
我知道我可以自己解析$PATH
來尋找路徑,但實際上,沒有其他選擇嗎? 沒有其他人在某處實現它供我使用嗎?
有些系統可能提供execvpe()
。 Google搜索“execvpe”會顯示各種選項,包括至少一個實現(比后面的內容復雜得多,但它在自己的代碼中包含了大部分execvp()
)。
對於那些沒有的人,您可以為自己提供:
int execvpe(const char *program, char **argv, char **envp)
{
char **saved = environ;
int rc;
environ = envp;
rc = execvp(program, argv);
environ = saved;
return rc;
}
你可能在沒有rc
情況下生存(只是強行返回-1),因為execvp()
只返回-1
(它只會在錯誤時返回)。
您可能甚至不必擔心此代碼中的線程安全性。 將使用它的正常方案就在fork()
之后,此時,進程中只有一個線程。 如果您認為可以在有多個線程時使用它,那么您需要仔細考慮是否可以安全地修改全局環境。 顯然,如果execvp()
成功,則不會出現問題(所有線程都會突然終止)。 如果execvp()
失敗,那么其他一個線程可能會看到修改后的環境,並可能在此基礎上做出錯誤的決定。 在這種情況下,你需要適當地保護環境(並可能涉及(互斥)鎖定getenv()
setenv()
和putenv()
中以及execvpe()
(我發現的execvpe()
的實現通過實現execvp()
邏輯然后使用execve()
來執行程序來避免線程安全問題。)
通常,如果execvpe()
返回,則進程將退出,因此通常恢復環境不會影響程序。 但是,它比抱歉更安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.