%EB%8A%94%20%EC%96%B4%EB%96%BB%EA%B2%8C%20Linux%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9C%BC%EB%A1%9C%20%EC%A0%84%EC%86%A1%EB%90%A9%EB%8B%88%EA%B9%8C%3F.png)
내가 아는 것은 프로세스의 파일 설명자 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
를 받지만 SIGTTOU
Linux에서는 신호를 받지 않습니다.
이러한 시스템 중 하나에서배경SIGWINCH
프로세스는 제어 tty의 크기가 조정될 때나 포그라운드 프로세스가 될 때 신호를 받지 않습니다 . 전체 화면 프로그램은 전경에서 실행 중이거나 중지되어 있다고 가정하고 신호에 따라 터미널 크기를 쿼리합니다 SIGCONT
(대체 화면으로 전환하거나 표준 모드를 끄는 등의 다른 tty 작업과 함께).
프로세스는 제어 tty가 되기 위해 tty에 대한 열린 핸들을 가질 필요가 없으며, 제어 tty가 되지 않고도 tty에 대한 열린 핸들을 가질 수 있습니다.
tty의 전경 프로세스 그룹에 있는 것 외에 프로세스가 터미널 크기 변경을 알릴 수 있는 다른 방법은 없습니다. 또한 알림을 받을 수 있는 일반적인 방법은 없습니다.다른터미널 매개변수를 변경하면 편집 tcsetattr(3)
할 수 있는 신호나 이벤트가 생성되지 않습니다 .select(2)
[1]tcgetwinsize
표준 인터페이스는 및 tcsetwinsize
함수와 함께 향후 POSIX 버전에 포함될 예정이며 ioctl(TIOC[SG]WINSZ)
. 보다여기자세한 내용은.