Linux에서는 사용자가 bash, sh, csh 등과 같은 명령을 셸에 삽입합니다. 사용자가 쉘의 커널 위치에 명령을 삽입하면 어떻게 됩니까?
사용자가 명령을 실행할 때 시스템 호출이 실행됩니까?
사용자가 vi /etc/passwd. vi /etc/passwd 명령은 커널에 전달되어야 하며, 커널은 사용자 권한을 확인하고 파일 내용을 반환하거나 사용자에게 /etc/passwd에 대한 권한이 있는 경우 이와 유사합니다.
답변1
Kusarananda가 지적했듯이 문제는 까다로운 문제입니다. 댓글에 쉽게 들어갈 수 없는 높은 수준의 관점을 갖는 것이 도움이 될 수 있습니다.
커널은 셸에서 명령 처리를 직접적으로 담당하지 않습니다. 쉘 자체는 프로그램입니다. 쉘은 사용자가 명령에 입력한 텍스트를 해석한 다음 해당 명령을 기반으로 작업을 수행합니다.
Bash, KSH, ZSH를 포함하여 Linux에서 사용할 수 있는 다양한 셸이 있다는 점을 이해하는 것도 중요합니다. 따라서 사용하는 셸에 따라 셸에서 사용되는 정확한 시스템 호출이 약간 다를 수 있습니다.
일반적으로 일부 명령은 셸에 직접 내장되어 있지만 실제로는 대부분이 PATH
환경 변수에 나열된 디렉터리에 있는 프로그램입니다. 이는 많은 명령에 대해 쉘이 취하는 조치는 다른 프로그램을 실행하는 것임을 의미합니다. 이는 시스템 호출을 통해 수행됩니다.fork
그 다음에exec
.
예:
vi /etc/passwd
쉘은 /etc/passwd
그것이 무엇인지 모르거나 신경쓰지 않습니다. 오직 이것이 vi
프로그램( /usr/bin/vi
)이라는 것만 알고 있다. vi를 실행하기 위해 fork(), exec()를 사용하고, exec()에 매개변수로 "/etc/passwd"라는 텍스트를 전달합니다. 그런 다음 호출됩니다.wait
vi가 완료될 때까지 기다렸다가 반환 값을 얻습니다.
커널은 "/etc/passwd" 문자열에 관심이 없습니다. 이는 vi로 전달되며 vi는 이를 열려는 파일로 해석합니다. vi는 전화를 담당합니다open
파일을 엽니다. 이 단계에서만 커널은 현재 사용자가 파일을 열 수 있는지 여부를 확인합니다.
이전에 언급했듯이 사용되는 정확한 시스템 호출은 매우 다양하며 Kusalananda가 지적한 것처럼 이 질문은 셸에서 수행되는 모든 것을 나열하기에는 너무 혼란스럽습니다. 그러나 기본 fork() exec() wait()는 모든 프로그램을 실행할 때 일반적인 패턴입니다. .