2012-01-11 2 views
6

execvp을 호출 할 때, 예를 들어 execvp(echo, b)을 호출하면 b는 명령 a에 대한 인수 배열입니다. 나중에이 배열을 변경하면 이전에 작성한 execvp 호출에 영향을 줍니까? execp (echo, b)를 호출하면 b의 내용 대신 (null) 출력됩니다. 왜 인자를 올바르게 전달해야하는지, 그리고 내가해야 할 일을 지적 할 수 있습니까?execvp의 인수 배열 처리 중입니까?

답변

12

친척 인 경우 exec()으로 전화 한 후 원래 프로그램이 이 아니며이 더 이상 존재하지 않습니다. 즉, 결코 실행되지 않으므로 해당 프로그램에서 아무 것도 exec() 호출 이후에 영향을 줄 수 없음을 의미합니다. 인수 배열을 올바르게 구축하지 않았습니까? execvp() man page에서

#include <unistd.h> 

int main(void) 
{ 
    char *execArgs[] = { "echo", "Hello, World!", NULL }; 
    execvp("echo", execArgs); 

    return 0; 
} 

: 여기에 빠른 작업 execvp()의 예입니다

execv(), execvp()execvpe() 함수는 널 (null)로 종료하는 문자열을 포인터의 배열을 제공은 새 프로그램에서 사용할 수있는 인수 목록을 나타냅니다. 일반적으로 첫 번째 인수는 실행중인 파일과 관련된 파일 이름을 가리켜 야합니다. 포인터의 배열 은 포인터로 끝나야합니다.이어야합니다.

일반적인 실수는 "첫 번째 인수는 관습에 따라 실행중인 파일과 관련된 파일 이름을 가리켜 야합니다"라는 부분을 건너 뜁니다. 이것이 echo이 "echo"를 argv[0]으로 가져 오는 부분입니다. 아마도 이것은에 따라 달라집니다.

+0

에코를 사용하는 대신, argv 배열의 모든 것을 본질적으로 인쇄하는 다른 프로그램을 사용했습니다. 나는 항상 argv [0]가 명령 자체의 이름 (execv의 첫 번째 매개 변수)이 될 것이라고 가정했으나이 경우 execv를 호출 한 후 argv [0]은 그렇지 않습니다. 오히려 그것이 execv의 두 번째 매개 변수였습니다. 이 점을 분명히 할 수 있습니까? – Lucas

+0

글쎄, 당신이 인수 목록을'execv'에 넘길 때'argv [0]'을 명령어 이름으로 설정 했습니까? 새로운 프로그램에서 두 번째 인자'execvp' *로 넘겨주는 배열은'argv'가되므로 기대했던대로 설정해야합니다. –

+0

이 코드는 const의 정확성을 손상시킵니다. 차라리 const char * args [] = {...};라고 쓰고 싶습니다. 그러나 execvp의 프로토 타입은 args의 문자열이 쓰기 가능해야합니다! – user877329

0

exec 전화가 오면 새로운 프로그램으로 교환됩니다. 더 이상 실행되지 않으므로 exec 호출 이후 동일한 프로세스의 코드는 실제로 도달 할 수 없습니다.

b 배열이 NULL로 끝났습니까? exec가 제대로 작동하려면 마지막 요소가 NULL이어야합니다. 또한 첫 번째 매개 변수를 "echo"로 설정해야합니다 (argv [0]). 당신이 원하는대로

execlp("echo", "echo", "something", NULL); 

가, BTW execlp 좀 더 편안하게 사용하는 것입니다 시도, 당신은 많은 매개 변수를 전달할 수 있습니다.

+1

그건'execvp()'가 작동하는 방식이 아닙니다. –

+0

내가 이해 한 바로는 execvp는 명령과 argv 배열을 사용합니다. execvp 호출시 명령과 argv 배열은 모두 NULL이 아니 었습니다. 그러나 에코가 호출 될 때 아무런 인자도없는 것 같습니다. – Lucas

+0

죄송합니다, 오타가'execlp'를 의미했습니다 ... –