일부 시스템은 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()
반환하는 경우, 프로세스가 너무 자주 종료됩니다 환경 복원은 프로그램에 영향을 미치지 않습니다. 그러나, 그것은 미안보다 더 안전합니다.
고맙습니다! 이것이 내가 찾고 있었던 것입니다 : – abyx
경고 : 코드는 공식적으로 테스트되지 않았으므로 적절한주의를 기울여 사용하십시오. –