내가 아는 것은 프로세스가 기본적으로 파일 설명자 0/1을 stdin/stdout으로 설정한다는 것입니다. 그러나 vi와 같은 프로그램은 창 크기를 어떻게 알 수 있습니까? 특히 데스크탑 환경에서 창 크기를 자유롭게 조정할 수 있는 경우에는 더욱 그렇습니다. 이것이 신호를 통해 어떻게 전송되는지 알 수 없으므로 다른 메커니즘이 있는 것 같습니다.
나는 터미널 에뮬레이터에 대해 아무것도 모르고 이것이 이 문제와 관련이 있을 수 있다고 생각합니다. 어떤 조언이라도 도움이 되고 감사하겠습니다.
답변1
터미널의 크기는 커널의 내부 구조에 저장되며 ioctl을 통해 쿼리 TIOCGWINSZ
하고 설정할 수 있습니다 TIOCSWINSZ
. 자세한 내용은 ioctl_tty(2)
맨페이지를 참조하십시오.
창 크기를 설정할 때마다 TIOCSWINSZ
(예: xterm
GUI 창 크기를 조정할 때) 커널은 다음과 같은 SIGWINCH
메시지를 보냅니다.포그라운드 프로세스 그룹터미널의.
아이디어는 이와 같은 프로그램이 vi
해당 신호를 포착하고 창 크기를 업데이트한다는 것입니다 TIOCGWINSZ
.
xterm
창 크기는 일반적으로 의사 tty 마스터(예: 또는 ) 를 구동하는 프로그램에 의해 설정되지만 sshd
tty를 열 수 있는 모든 프로세스(읽기 전용 또는 쓰기 전용 모드)에서 이를 수행할 수 있습니다.
이러한 ioctl의 명령줄 인터페이스는 stty
프로그램을 통해 구현됩니다. (예를 들어 stty cols 80 rows 40
). 이는 고유한 크기가 없고 해당 정보를 전달하는 표준 방법이 없는 실제 직렬 터미널에 유용합니다.
아직 표준화되지는 않았지만[1], 이들 중 어느 것도 Linux에만 국한되지 않으며 BSD 또는 Solaris와 같은 다른 시스템에서도 유사하게 작동합니다. 중요한 차이점은배경컨트롤 tty의 크기를 변경하려는 프로세스는 BSD 및 Solaris에서는 신호를 받지만 TIOCSWINSZ
Linux에서는 그렇지 않습니다.SIGTTOU
이러한 시스템 중 하나에서배경프로세스는 SIGWINCH
제어 tty의 크기가 조정되거나 포그라운드 프로세스가 될 때 신호를 수신하지 않습니다. 전체 화면 프로그램은 전경에서 실행 중이거나 중지되었다고 가정하고 SIGCONT
신호를 기반으로 터미널 크기를 쿼리합니다(대체 화면으로 전환하거나 표준 모드 끄기와 같은 기타 tty 작업도 포함).
프로세스는 제어 tty가 되기 위해 tty에 대한 열린 핸들을 가질 필요가 없으며, 제어 tty가 되지 않고도 tty에 대한 열린 핸들을 가질 수 있습니다.
tty의 전경 프로세스 그룹에 들어가는 것 외에 터미널 크기 변경 프로세스를 알리는 다른 방법은 없습니다. 게다가, 통지할 수 있는 보편적인 방법은 없습니다.다른터미널 매개변수 변경: 편집 가능한 신호나 이벤트가 생성되지 tcsetattr(3)
않습니다 .select(2)
[1]표준 인터페이스는 향후 POSIX 버전에 포함될 것으로 예상되며 다음과 같이 쉽게 구현할 수 있는 기능을 tcgetwinsize
포함 합니다 .tcsetwinsize
ioctl(TIOC[SG]WINSZ)
여기더 알아보기.