아주 이상한 사고를 추적하려고합니다. 너무 이상한 점은 누군가가 발견했는데 설명 할 수없는 해결 방법입니다. 하지exec가 exec'ed 프로그램의 동작을 어떻게 바꿀 수 있습니까?
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
if (argc == 1)
{
fprintf(stderr, "Usage: %s prog [args ...]\n", argv[0]);
return 1;
}
execvp(argv[1], argv + 1);
fprintf(stderr, "execv failed: %s\n", strerror(errno));
// If exec returns because the program is not found or we
// don't have the appropriate permission
return 255;
}
당신이 볼 수 있듯이,이 모든 프로그램은 다른 프로그램 자체를 대체하는 execvp
을 사용할 수 있습니다 :
해결 방법은 내가 '주자'라고 부르는 것이 작은 프로그램입니다.
프로그램 충돌이 직접 명령 줄에서 호출됩니다
/path/to/prog args # this crashes
하지만 간접적으로 내 주자 심을 통해 호출 될 때 잘 작동 : 내 인생
/path/to/runner /path/to/prog args # works successfully
, 여분의 exec가 실행중인 프로그램의 동작을 어떻게 바꿀 수 있는지를 알아낼 수 있습니다 (프로그램이 환경을 변경하지 않는 것을 볼 수 있듯이).
충돌에 대한 배경 정보입니다. 크래시 자체가 C++ 런타임에서 발생합니다. 특히 프로그램에서 throw
을 실행하면 충돌하는 버전에서 일치하는 catch가 있다고 잘못 인식하고 (terminate
) 호출합니다. 러너를 통해 프로그램을 호출 할 때 예외가 제대로 포착됩니다.
제 질문은 추가 exec가 exec'ed 프로그램의 동작을 변경하는 이유는 무엇입니까?
잘 모르겠다.하지만 execvp가 작업 디렉토리를 변경합니까? 어떤 논쟁을하고 있습니까? –
@MartinYork - AFAIK,'execvp'는 작업 디렉토리를 변경하지 않습니다 ('chdir'에 대한 호출이 필요하고 러너는 그렇게하지 않습니다). 구체적인 주장은 부적합하다. 설명 된 동작은 프로그램에 전달 된 특정 인수와 독립적입니다. –
'execvp()'대신에'execv()'를 사용하면 똑같은 일을합니까? – caf