Ctrl-S / XOFF가 프로세스에 미치는 영향

Ctrl-S / XOFF가 프로세스에 미치는 영향

실행했을 때 실수로 해당 터미널 창에 -를 apt upgrade보냈습니다 .CtrlS

이제 나는 XOFF,, XON- 그리고 텔레타이프 기계에 대한 새로운 사실을 알게 되었습니다 Ctrl.Q

"pause" 터미널에 -를 보내면 Ctrl작업이 계속됩니다.Qapt

그것을 읽어보면 , 수신된 명령에서 무슨 일이 일어나는지, 아니면 일반적으로 무슨 일이 일어나는지 XOFF명확하지 않습니다 . 디스플레이 업데이트가 중지되었습니다. 좋은 일인데, 여전히 실행 중인가요?aptXOFFhtophtop

아직도 apt달리고 있나요? 아니면 실제로 apt정지되었거나 htop동결되었나요?

분명히 프로세스는 여전히 입력을 받을 수 있으므로 XOFF여전히 실행 중입니다.

뭐가 문제 야? 예를 들어, 프로그램 카운터는 단순히 프로그램 카운터 증가를 중지하고 프로그램을 정지시키는 것이 아닙니다.

XOFF를 처리하도록 명령이 프로그래밍된 방식에 따라 달라집니까? 기본 Linux 명령에 대해 예상할 수 있는 일반적인 동작이 있습니까?

노트저것이것비슷한 질문에는 프로그램 자체에 어떤 일이 일어나는지 언급하지 않기 때문에 내 질문에 대한 답변이 포함되어 있지 않습니다. 예를 들어 apt자동으로 계속 실행되는지, 정지/일시 중지 상태인지 알 수 없습니다 .

답변1

기본적으로 + 및 + 에 바인딩된 및 는 다음과 같다는 XON것을 이미 알고 계실 것입니다.XOFFCtrlSCtrlQ소프트웨어 흐름 제어인물과 원리의 유물종이 인쇄 텔렉스 단말기의 옛날. 수신 장치(보통 종이 프린터)가 때때로 원격 발신자가 보낸 입력을 따라잡을 수 없을 때 사용됩니다.

오늘날 종이 텔레타이프는 더 이상 사용되지 않지만 그 뒤에 숨은 아이디어는 "터미널"의 소프트웨어 프레임워크에 남아 있습니다(예:여기그리고이것은 TTY의 역사에 관한 매우 좋은 기사입니다.)는 원래 종이 터미널에서 사용된 일부 개념을 상속하고 여전히 구현합니다. 그 중 하나는 흐름 제어 문자를 해석하는 기능입니다.

일반적으로 "콘솔에서"(즉, 의사 터미널에 연결된) 실행되는 프로그램 XON은 및 XOFF문자를 볼 수 없습니다. 왜냐하면 기본적으로 터미널에서 캡처하기 때문입니다. 여기서 표준 동작은 XOFF프로그램에서 인쇄 출력이 수신되는 것을 중지하는 것입니다. 프로그램 자체는 영향을 받지 않고 백그라운드에서 계속 실행됩니다. 단지 출력이 다시 수신될 때까지 사용자에게 "전달"되지 않는다는 것입니다 XON.

프로그램을 작성하고 이러한 입력 문자를 명시적으로 수신하려면 tcsetattr()프로그램에서 시스템 호출을 사용하여 플래그를 통해 소프트웨어 흐름 제어를 비활성화 할 수 있습니다 IXOFF.예를 들어 여기)--nano이 방법, 예를 들어.

답변2

htop디스플레이 업데이트를 중지했습니다. 알 만한 가치가 있지만 htop[Ctrl-S를 누른 후] 여전히 실행 중입니까?

네, 맞습니다. htop또는 다른 명령은 Ctrl-S로 중지되거나 고정되지 않습니다.

termios IXON설정은 와 다릅니다 ISIG. VSTOP(Ctrl-S) 또는 VSTART(Ctrl-Q) 문자를 입력하면 터미널에서 실행 중인 프로세스에 신호가 전송되지 않습니다.

두 개의 터미널을 여는 것은 쉽습니다. 처음에는 Enter를 입력하세요.

tail -f /tmp/file

두 번째에는

cat > /tmp/file

이제 두 번째 터미널에 Ctrl-S를 입력하고 계속해서 맹목적으로 줄을 입력한 후 Enter를 누르세요. 첫 번째 터미널 화면에 나타납니다. 쉘 이 아니고 cat명령이 유사한 경우 rm ...화면에 표시되지 않고 실행됩니다.

XOFF를 수신하는 명령에서는 일반적으로 어떤 일이 발생합니까?

이 명령은 "XOFF를 수신"하지 않습니다. 이것은 모두 터미널 드라이버 내부에서 처리됩니다. 애플리케이션의 관점에서는 아무 일도 일어나지 않습니다. 프로그램이 계속해서 많은 출력을 보내는 경우(또는 ECHOtermios 설정이 기본 상태에 있고 계속해서 많은 입력을 받는 경우) Ctrl-Q를 누를 때까지 터미널에 대한 쓰기(또는 해당 읽기)가 어느 시점에서 차단됩니다. 받았다 .

관련 정보