터미널 정보(예: 창 크기)는 어떻게 Linux 프로그램으로 전송됩니까?

터미널 정보(예: 창 크기)는 어떻게 Linux 프로그램으로 전송됩니까?

내가 아는 것은 프로세스의 파일 설명자 0/1이 기본적으로 stdin/stdout으로 설정되어 있다는 것입니다. 하지만 vi와 같은 프로그램은 특히 데스크탑 환경에서 창 크기를 자유롭게 조정할 수 있는 경우 창 크기를 어떻게 알 수 있습니까? 이것이 신호를 통해 어떻게 전송될 수 있는지 생각할 수 없으므로 다른 메커니즘이 있는 것 같습니다.

나는 질문과 관련이 있을 것으로 생각되는 터미널 에뮬레이터에 대해 아무것도 모릅니다. 어떤 조언이라도 도움이 될 것이며 감사하겠습니다.

답변1

터미널의 크기는 커널 내부 구조에 유지되며 ioctl로 쿼리 TIOCGWINSZ하고 설정할 수 있습니다 TIOCSWINSZ. 자세한 내용은 맨페이지를 참조하세요 ioctl_tty(2).

창 크기가 설정될 때마다 TIOCSWINSZ(예: xtermGUI 창 크기가 조정될 때) 커널 SIGWINCH포그라운드 프로세스 그룹그 터미널의.

같은 프로그램은 vi해당 신호를 포착하고 를 통해 창 크기에 대한 아이디어를 업데이트합니다 TIOCGWINSZ.

xterm창 크기는 일반적으로 의사 tty(예: 또는 ) 의 마스터 끝을 구동하는 프로그램에 의해 설정되지만 sshdtty를 열 수 있는 모든 프로세스(읽기 전용 또는 쓰기 전용 모드)에서 이를 수행할 수 있습니다.

해당 ioctl에 대한 명령줄 인터페이스는 stty프로그램을 통해 이루어집니다. (예: stty cols 80 rows 40). 이는 고유한 크기가 없고 해당 정보를 전달하는 표준 방법이 없는 실제 직렬 터미널에 유용합니다.


아직 표준화되지는 않았지만[1], 이 모든 것은 Linux에만 국한되지 않으며 BSD 또는 Solaris와 같은 다른 시스템에서도 유사하게 작동합니다. 주목할만한 차이점은배경제어 tty의 크기를 변경하려고 시도하는 프로세스는 BSD 및 Solaris에서는 신호 TIOCSWINSZ를 받지만 SIGTTOULinux에서는 신호를 받지 않습니다.

이러한 시스템 중 하나에서배경SIGWINCH프로세스는 제어 tty의 크기가 조정될 때나 포그라운드 프로세스가 될 때 신호를 받지 않습니다 . 전체 화면 프로그램은 전경에서 실행 중이거나 중지되어 있다고 가정하고 신호에 따라 터미널 크기를 쿼리합니다 SIGCONT(대체 화면으로 전환하거나 표준 모드를 ​​끄는 등의 다른 tty 작업과 함께).

프로세스는 제어 tty가 되기 위해 tty에 대한 열린 핸들을 가질 필요가 없으며, 제어 tty가 되지 않고도 tty에 대한 열린 핸들을 가질 수 있습니다.

tty의 전경 프로세스 그룹에 있는 것 외에 프로세스가 터미널 크기 변경을 알릴 수 있는 다른 방법은 없습니다. 또한 알림을 받을 수 있는 일반적인 방법은 없습니다.다른터미널 매개변수를 변경하면 편집 tcsetattr(3)할 수 있는 신호나 이벤트가 생성되지 않습니다 .select(2)

[1]tcgetwinsize표준 인터페이스는 및 tcsetwinsize함수와 함께 향후 POSIX 버전에 포함될 예정이며 ioctl(TIOC[SG]WINSZ). 보다여기자세한 내용은.

관련 정보