簡體   English   中英

用路徑搜索執行?

[英]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.

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