실행할 프로그램의 이름만 주어지면 Unix는 프로그램의 절대 경로를 어떻게 알 수 있습니까?

실행할 프로그램의 이름만 주어지면 Unix는 프로그램의 절대 경로를 어떻게 알 수 있습니까?

실행할 프로그램을 생성할 때 프로그램이 생성된 작업 디렉터리와 관련이 있다고 가정합니다.

답변1

전체 또는 상대 경로 없이 프로그램을 호출하고 프로그램이 함수 또는 내장이 아니라고 가정하면 해당 프로그램을 찾으려면 PATH 환경 변수에 있어야 합니다.

3.7.2 명령어 검색 및 실행

Bash는 여러 PATH 검색을 피하기 위해 실행 파일의 전체 경로 이름을 기억하기 위해 해시 테이블을 사용합니다(Bourne Shell 내장 함수의 해시 설명 참조). $PATH의 디렉터리에 대한 전체 검색은 해시 테이블에서 명령을 찾을 수 없는 경우에만 수행됩니다. 검색에 실패하면 쉘은 command_not_found_handle이라는 정의된 쉘 함수를 검색합니다. 함수가 존재하는 경우 원래 명령과 원래 명령의 인수를 인수로 사용하여 별도의 실행 환경에서 호출되며 함수의 종료 상태는 서브쉘의 종료 상태가 됩니다. 이 함수가 정의되지 않은 경우 쉘은 오류 메시지를 인쇄하고 종료 상태 127을 반환합니다.

답변2

프로그램이 실행되면 호출 프로그램(일반적으로 셸)은 PATH환경 변수에 나열된 디렉터리에서 규칙에 따라 프로그램을 검색합니다. 이를 위해 호출 프로그램은 execlp, , 또는 execvp같은 라이브러리 함수를 사용하여 execvpe검색을 수행하거나 호출 프로그램 자체에서 유사한 논리를 구현할 수 있습니다.

라이브러리 함수는 궁극적으로 execve프로그램의 실제 실행의 주요 힘인 시스템 호출을 호출합니다. 호출 execve은 프로그램이 포함된 파일의 이름인 파일 이름을 첫 번째 인수로 사용합니다. 이름은 일반적으로 파일의 절대 경로이지만 상대 경로일 수도 있습니다. 이 경우 파일 검색은 프로세스의 현재 디렉터리에서 시작됩니다. (파일이 현재 디렉토리에 포함될 필요는 없습니다. 예를 들어 이름은 . ../../myprogram) 시스템 호출은 환경 변수를 execve고려하지 않습니다 .PATH

그렇다면 시스템 호출에 상대 경로가 제공되면 커널은 프로그램의 절대 경로를 어떻게 알 수 있습니까 execve? 대답은 '아니오'이며 그럴 필요도 없습니다.

관련 정보