2011-10-17 126 views
4

我想從我的代碼執行一個程序,併爲其提供環境變量和參數。 AFAICT,execve是正確的選擇。execve帶路徑搜索?

但是,execve收到path參數,而不是filename,這意味着它期望第一個參數是可執行文件的路徑。

我知道我可以自己解析$PATH找到路徑,但是真的,有沒有別的選擇?沒有其他人在某處使用它?

回答

8

某些系統可能會提供execvpe()。谷歌搜索'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()返回時,進程將退出,所以很多時候恢復環境不會影響程序。然而,這比安慰更安全。

+0

謝謝!這是我正在尋找:) – abyx

+0

警告:該代碼尚未正式進行測試 - 謹慎使用。 –