2011-10-17 3 views
4

내 코드에서 프로그램을 실행하고 환경 변수 및 인수를 제공하려고합니다. AFAICT, execve이 올바른 선택입니다.경로 찾기로 execve 하시겠습니까?

그러나 execve은 이 아니라 path 인수를 수신합니다. 즉, 첫 번째 인수가 실행 파일의 경로가 될 것으로 예상합니다.

나는 경로를 찾으려면 $PATH을 구문 분석 할 수 있지만 실제로는 다른 선택 사항이없는 것으로 알고 있습니다. 아무도 나를 위해 그것을 어딘가에 구현하지 않았습니까?

답변

8

일부 시스템은 execvpe()을 제공 할 수 있습니다. 'execvpe'에 대한 Google 검색은 적어도 하나의 구현을 포함하여 다양한 옵션을 표시합니다 (다음 코드보다 훨씬 복잡하지만 자체 코드에 대부분 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; 
} 

당신은 아마 (단지 강제 -1, 리턴) execvp() 때문에 오직 -1을 반환 rc없이 살아남을 수 (그리고 그것은 단지 이제까지 반환, 당신은 자신을 위해 제공 할 수 있습니다하지 않는 사람들을 위해

오류).

이 코드에서는 스레드 안전성에 대해 걱정할 필요가 없습니다. 그것을 사용하는 정상적인 시나리오는 fork() 바로 뒤에 있으며,이 시점에서 프로세스에는 하나의 스레드 만 존재합니다. 둘레에 스레드가 여러 개있을 때 사용할 수 있다고 생각되면 간단히 글로벌 환경을 수정하는 것이 안전한지에 대해 신중하게 생각해야합니다. 분명히 execvp()이 성공하면 문제가 발생하지 않을 것입니다 (모든 스레드가 갑자기 종료됩니다). execvp()이 실패하면 다른 스레드 중 하나가 수정 된 환경을 볼 수 있으며이를 기반으로 잘못된 결정을 내릴 수 있습니다. 어떤 경우에는 적절하게 환경을 보호해야하며 getenv(), setenv()putenv()execvpe()에 잠금을 설정하는 것이 좋습니다.

은 (내가 찾은 execvpe()의 구현은 프로그램을 실행 execve()를 사용하여 다음 execvp() 로직을 구현하고하여 스레드 안전 문제를 피할 수 있습니다.)

일반적으로는, execvpe() 반환하는 경우, 프로세스가 너무 자주 종료됩니다 환경 복원은 프로그램에 영향을 미치지 않습니다. 그러나, 그것은 미안보다 더 안전합니다.

+0

고맙습니다! 이것이 내가 찾고 있었던 것입니다 : – abyx

+0

경고 : 코드는 공식적으로 테스트되지 않았으므로 적절한주의를 기울여 사용하십시오. –