%20%EC%BD%98%EC%86%94.png)
저는 C의 쉘 프로그램 구현에 대해 읽고 있습니다(MIT 6.828 운영 체제 엔지니어링 과정의 xv6 쉘).
셸의 기능은 main()
다음 코드로 시작됩니다.
//Assumes three file descriptors open
while((fd = open("console", O_RDWR)) >= 0){
if(fd >= 3){
close(fd)
break;
}
}
다음은 위의 코드를 설명하는 xv6 책의 인용문입니다.
"셸은 콘솔의 기본 파일 설명자인 세 개의 파일 설명자가 항상 열려 있는지 확인합니다."
나는 이것이 open()
사용 가능한 가장 작은 수의 파일 설명자를 반환한다는 것을 알고 있으므로 이 코드는 3개 이하의 파일 설명자가 열리지 않도록 보장합니다. 이는 작성자의 설명을 읽은 후에 매우 분명합니다.
다만, 이해가 안되는 부분은 다음과 같습니다.
쉘이 0, 1, 2를 제외한 모든 파일 설명자를 닫는 이유는 무엇입니까? 결국 0, 1, 2가 콘솔과 연결된다는 것이 보장되지 않습니까? 쉘이 많은 수의 파일 설명자를 닫는 데 신경을 써야 하는 이유는 무엇입니까?
여기서 콘솔( /dev/console ?) 파일의 목적을 잘 이해하지 못하는 것 같습니다.
답변1
이 코드 조각이 열립니다 /dev/console
. 결과 파일 설명자는 아직 열리지 않은 가장 낮은 번호의 파일 설명자입니다. 숫자가 최대 2이면 루프를 다시 실행합니다. 숫자가 3 이상이면 설명자가 닫히고 루프가 중지됩니다.
루프가 끝나면 파일 설명자 0 ~ 2(표준 입력, 표준 출력 및 표준 오류) 공개가 보장됩니다. 해당 파일은 이전에 열렸으며 잠재적으로 파일에 연결되었거나 방금 열려서 에 연결되었습니다 /dev/console
.
선택 /dev/console
이 이상해요. 나는 /dev/tty
항상 호출 프로세스의 프로세스 그룹과 연관된 제어 터미널이기를 원합니다. 이것은 몇 안되는 파일 중 하나입니다POSIX 표준에는 다음이 필요합니다.. /dev/console
~이다시스템 콘솔, 이것은 syslog 메시지가 콘솔로 전송되는 곳입니다. 쉘이 이에 대해 신경 쓰는 것은 쓸모가 없습니다.
답변2
루프는 재미있습니다. 'open()'은 최소 파일 설명자 수를 반환합니다. 예를 들어, 현재 fd는 10입니다. 이는 0, 1... 및 9가 이전에 열렸음을 나타냅니다. 방금 연 콘솔에 대한 추가 파일 설명자를 닫습니다.