[unix] CTRL + C 후에 콘솔을 재설정해야하는 이유

에 의해 취소되면 일부 명령 행 인터페이스 도구가 깨진 콘솔을 반환합니다 CTRL+C. 때로는 텍스트가 보이지 않거나 명령을 실행할 때까지 그래픽 문제가 있습니다 reset.

(bash를 사용하지만 셸과 독립적이라고 생각합니다.)

이 효과의 이름이 있습니까? 이 문제의 원인은 무엇이며 프로그래머가 도구에서이를 방지하는 방법은 무엇입니까? 주요 프로그래밍 언어에서이 문제를 해결하는 전략이 있습니까?



답변

콘솔 화면은 때때로 필요 reset(1) (또는 stty(1)일부 프로세스를 종료 (예를 들어, 프로그램이 쉘에 의해 시작) 할 때 의사 단말기의 상태가 변경되지 않기 때문에 명령).

tty demystified를 읽으십시오 .

(나는 의사 터미널의사를 다루는 것이 리눅스에서 가장 어려운 부분이라고 생각한다)

주요 프로그래밍 언어에서이 문제를 해결하는 전략이 있습니까?

터미널을 다루고 모드 또는 회선 규율을 변경하는 올바르게 작동하는 프로그램은 충돌을 피하고 터미널을 올바른 상태 로 만들기 위해 적절한 호출 ( termios (3) 참조 )을 시도해야합니다 . BTW, ncurses 또는 readline 과 같은 라이브러리 가 유용하지만 정리 루틴을 적절하게 호출해야합니다.

signal (7)signal-safety (7)을 참조하십시오 . 코드 충돌을 피하는 것은 어렵습니다. 정의되지 않은 동작 에 대해 읽으십시오 .

불완전한 해결 방법은 프로그램을 실행하는 쉘 함수를 정의한 다음 reset(때로는 부적절 할 수 있는) 쉘 함수를 정의하는 것 입니다.


답변

이 문제에 대응하는 것은 완전히 쉘 독립적이지 않습니다. zsh ttyctl에는 tty 모드를 “고정”또는 “고정 해제”할 수 있는 내장 기능이 있습니다. bash에는 동등한 것이 없다고 생각합니다. settytcsh 의 명령은 동일한 작업을 수행하지만보다 세분화 된 : 개별 설정을 고정 할 수 있습니다.

tty 모드를 정지한다는 것은 zsh가 현재 모드를 기억한다는 것을 의미하며, 미래의 일부 하위 모드가 변경되면 하위 모드가 일시 중지되거나 종료 될 때 모드가 복원됩니다.

이렇게하면 터미널이 손상되거나 그렇지 않으면 터미널 정리에 실패하는 프로그램의 일부 나쁜 영향으로부터 보호 할 수 있습니다. 로 변경하려면 고정을 stty해제해야합니다 stty. 그렇지 않으면 쉘이 수행 한 작업을 즉시 취소합니다 .

reset복원 stty모드 이상의 기능을 수행 하므로 가끔 필요할 수도 있지만 자주는 아닐 수도 있습니다.


답변