2011-10-03 6 views
2

execve를 사용하여 ls 명령을 실행하려고합니다. 현재 내가 다음 인수와 함께 실행 해요 :execve와 함께 새 경로를 사용하여 ls 명령을 실행하십시오.

execve(args[0], args, env_args) 
//args looks like {"ls", "-l", "-a", NULL} 
//env_args looks like {"PATH=/bin", "USER=me", NULL} 

나는 이것이 내 PATH에서 LS를 찾아 볼 것을 의미 나의 새로운 env_args를 사용하여 ls 명령을 실행 한 할 것으로 예상 무엇. 그러나이 코드는 실제로 아무 것도하지 않으며 코드를 실행할 때 출력없이 내 명령 프롬프트로 돌아갑니다.

동일한 args []를 사용하여 execvp와 ls가 작동하고 현재 경로를 검색했습니다.

내가 잘못하고있는 것을 말해 줄 수 있습니까?

내가하려는 것은 내 자신의 환경을 만들고 내보낼 수있는 쉘 프로그램을 작성하고 exec가 char *로 정의한 환경을 사용하도록하는 것입니다. 본질적으로 나는 env_args를 사용하여 vars를 추가하고 제거하는 함수를 작성하고 exec를 호출하면 { "ls", "-l", NULL}에 exec를 호출하여 새로운 환경을 보일 수 있기를 원한다. ls라는 유효한 프로그램의 경로 변수. 나는 이것이 내가 조금 더 잘하고있는 것을 설명하기를 바란다. 나는 extern 환경 var이이 경우에 나를 위해 일할 것이라고 생각하지 않는다.

답변

9

execve() PATH를 보지 않습니다. 그것을 위해서는 execvp()이 필요합니다. 귀하의 프로그램은 ls을 실행하는데 실패했으며, 분명히 execve() 이후에 프로그램 실행 실패를보고하지 않습니다. exec*() 함수 제품군의 멤버는 오류시에만 반환됩니다.

/bin을 현재 디렉토리로 사용하면 (./ls - 일명 ls -이 있기 때문에) 프로그램을 실행하면 예상 한 결과를 얻을 수 있습니다.

첫 번째 인수의 실행 파일 경로 이름을 execve()에 적절한 PATH 설정을 사용하여 찾은 다음 제공해야합니다.

또는 execvp()을 계속 사용하지만 새 환경에 변수 environ을 설정하십시오. 현재 environ<unistd.h>에 선언되었지만 (POSIX 2008), 이전에는 아무 데나 선언되지 않았습니다.

extern char **environ; 

environ = env_args; 
execvp(args[0], &args[0]); 

이전 값을 저장하고 복원 할 필요가 없습니다. 당신은 하위 프로세스에 있으며 환경을 전환해도 주 프로그램 (쉘)에 영향을 미치지 않습니다.


이 내가 예상대로 작동하는 것 같다 - 나는 예상대로 원래의 코드가 작동하는 것을 보여줍니다.

#include <stdio.h> 
#include <unistd.h> 

extern char **environ; 

int main(void) 
{ 
    char *args[]  = { "ls", "-l", "-a", NULL }; 
    char *env_args[] = { "PATH=/bin", "USER=me", NULL }; 

    execve(args[0], args, env_args); 
    fprintf(stderr, "Oops!\n"); 

    environ = env_args; 
    execvp(args[0], &args[0]); 
    fprintf(stderr, "Oops again!\n"); 

    return -1; 
} 

나는 '죄송합니다.' 그 다음에 내 디렉토리 목록이옵니다. 내가 현재 디렉토리에 실행 ls을 만들 때 :

#!/bin/sh 
echo "Haha!" 

은 내가 '죄송합니다!'하지 않는다 '하하!'를 얻으세요.

+0

괜찮지 만 execvp에서 내 환경에 정의 된 것과 다른 경로를보고 싶다고 말하고 싶습니까? 그게 내가 찾고있는 기능의 종류입니다 – james

+0

두 번째 생각에, 나는 환경이 내가 원하는 것이라고 생각하지 않습니다. 나는 아직도 이것을하는 방법을 모르겠다. – james

+0

왜 환경을 설정하는 것이 답이 아니라고 생각합니까?당신의 컴퓨터에서'ls' 파일은 어디에 있습니까? –

관련 문제