%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는 0,1...을 나타내는 10이고 9는 이전에 열려 있었습니다. 방금 연 콘솔에 대한 단일 추가 파일 설명자를 닫습니다.