2014-04-05 2 views
1

주어진 명령의 전체 경로를 알지 못하면 exec 시스템 호출 패밀리 구성원을 사용할 수 있습니다. 예를 들어 때 제대로 execv와를 사용할 수있는 커맨드에서 지정된경로를 사용하지 않고 Exec 시스템 호출

"/bin/ls -t" "/bin/cat -n" "/usr/bin/tr /a-z/ /A-Z/" 

입력 (ARG [0], 인수)이

(arg[0] -> full path of the command and args -> arguments of the command) 

하지만 것처럼 "LS/sbin에" "WC -w있을 때 ""cat "입력 나는 execv를 사용할 수 없다.

답변

0

실행 파일이 PATH 환경 변수 내에있는 경우 모든 "가족 구성원"이이를 수행 할 수 있습니다. 해당 변수는 실행 파일이 실행될 때 검색되는 콜론으로 구분 된 경로 목록을 보유 할 수 있습니다. 따라서 변수를 올바르게 설정하면됩니다. 일반적인 설정은 이러한 경로를

  • ~/빈 (현재 사용자의 bin 폴더)
  • 을 포함한다. (현재 디렉토리)
  • /빈
  • 는/usr/빈
  • 는/usr/당신이 사용자 계정이 실제로 문제의 명령을 실행 돌봐 줘야

주/빈 지역 -이 동적 인 방식으로 변경할 수 있습니다. 이 경우 다른 PATH 변수 일 수도 있고 호출 범위의 환경 내부의 변수가 아닐 수도 있습니다. 그러나 일반적으로 환경은 하위 프로세스로 완전히 전달됩니다. 이것은 다시 PATH 변수를 처음으로 설정하고 "내보낼"수 있다는 것을 의미하며 호출 한 다음 호출 된 범위에 상속됩니다. 일부 실행 파일의 위치가 될 수 없기 때문에 마술 는 간부 호출 또는 쉘에 의해 짐작, 어느 위치해야합니다 : whyever, 당신이 환경 변수를 사용할 수 없습니다 경우

, 당신은 어떻게 든 그 동작을 에뮬레이션 할 것이다 알려진 또는 검색해야합니다. 그래서 당신은 그러한 검색 알고리즘을 구현해야만 할 것입니다. 여러분은 실제로 최종 명령을 실행하는 데 사용하는 최소한의 셸 (일반적으로 "래퍼"라고 부름) 안에서 수행 할 수 있습니다. 따라서 래퍼를 호출하고 인수로 실행될 명령을 넘겨주고 명령을 검색 할 위치에 알려진 래퍼를 호출합니다. 그러나 다시 이것은 정확히 PATH 변수가 무엇인지에 대한 것입니다.

또 다른 옵션은 PATH 변수와 쉘 알고리즘을 사용하여 필요한 실행 파일을 검색하지만 수동으로 수행하는 것입니다. 이것은 whereiswhich 명령이있는 것입니다. man 페이지를 살펴보면 PATH 변수를 검색하고 일치 항목을 반환 할 수 있습니다. 따라서 먼저 원하는 실행 파일의 절대 위치를 쿼리 한 다음 그 절대 경로로 호출 할 수 있습니다.

3

함수 이름을 보면이 스크립트는 쉘 스크립트가 아니라 POSIX의 일반 C라고 가정합니다.

C에서 execlp() 또는 execvp() 함수를 사용할 수 있습니다. 'p'은 PATH 환경 변수가 지정된 실행 파일을 찾는 데 사용됨을 의미합니다.예를 들어

:

execlp("ls", "ls", "-t"); 

대신 :

execl("/bin/ls", "ls", "-t"); 
관련 문제