我想從我的代碼執行一個程序,併爲其提供環境變量和參數。 AFAICT,execve
是正確的選擇。execve帶路徑搜索?
但是,execve
收到path
參數,而不是filename
,這意味着它期望第一個參數是可執行文件的路徑。
我知道我可以自己解析$PATH
找到路徑,但是真的,有沒有別的選擇?沒有其他人在某處使用它?
我想從我的代碼執行一個程序,併爲其提供環境變量和參數。 AFAICT,execve
是正確的選擇。execve帶路徑搜索?
但是,execve
收到path
參數,而不是filename
,這意味着它期望第一個參數是可執行文件的路徑。
我知道我可以自己解析$PATH
找到路徑,但是真的,有沒有別的選擇?沒有其他人在某處使用它?
某些系統可能會提供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()
返回時,進程將退出,所以很多時候恢復環境不會影響程序。然而,這比安慰更安全。
謝謝!這是我正在尋找:) – abyx
警告:該代碼尚未正式進行測試 - 謹慎使用。 –