저는 현재 GStreamer를 사용하여 Linux의 비디오를 프레임버퍼에 직접 렌더링하고 있습니다.
렌더링하는 동안 가상 콘솔을 숨기는 방법을 알고 싶습니다. 커서 깜박임을 멈출 수 있지만 이는 콘솔에서 텍스트가 변경되지 않은 경우에만 작동합니다.
X가 Ctrl(+Alt)+F7을 통해 액세스할 수 있는 새 화면을 생성하는 것 같습니다. 저도 비슷한 작업을 수행할 수 있습니까? Ctrl+Alt+F1 및 Ctrl+Alt+F2를 사용하여 콘솔과 렌더링된 화면 간에 전환할 수 있습니다.
답변1
X는 새 화면을 생성하지 않습니다.
커널에 내장된 터미널 에뮬레이터에서 사용하는 것과 동일한 디스플레이 및 입력 이벤트 장치를 사용하려면(가상 터미널을 표시하기 위해) 프로그램에서 이를 공유하도록 준비해야 합니다. 커널의 터미널 에뮬레이터는 이러한 프로그램이 입력 및 출력을 담당할 시기와 커널에 내장된 터미널 에뮬레이터가 담당할 시기를 협상할 수 있는 API를 제공합니다.
이 API는 ioctl()
커널 가상 터미널 문자 장치에 노출된 파일 설명자를 호출하여 구현됩니다. Linux에는 64개의 장치가 있고 FreeBSD/PC-BSD에는 16개가 있습니다. X는 이것을 생성하지 않습니다. 기존 터미널을 엽니다. 관례에 따라 TUI 프로그램은 이를 동시에 커널 가상 터미널로 사용하려고 시도하지 않습니다. 즉, 관례상 X가 열고 사용하는 커널 가상 터미널 장치에서는 TUI 로그인 세션이 실행되지 않습니다.
커널 터미널 에뮬레이터와 공유되는 프로그램은 다음을 수행해야 합니다.
- ...커널 터미널 에뮬레이터에 프레임 버퍼에 대한 쓰기를 중지하여 출력이나 커서를 표시하도록 지시합니다. 이는
KDSETMODE
ioctl()
오늘날 명명 오류의 패턴을 설정 하여KD_GRAPHICS
수행됩니다 . 모드 에 있을 때KD_TEXT
커널 터미널 에뮬레이터는 이제 일반적으로 실제 텍스트 모드에 있는 디스플레이 하드웨어와 관련이 없습니다. 소위프레임버퍼 콘솔디스플레이 하드웨어를 그래픽 모드로 둡니다.KD_TEXT
모드와 모드의 차이점은KD_GRAPHICS
이전 모드에서 터미널 라인 규칙이 출력을 프레임 버퍼로 파이프할 때 커널의 터미널 에뮬레이터가 프레임 버퍼에 문자 모양을 그리고 후자에 있는 동안 커서도 그리는 것입니다. 모드에서는 전혀 그림을 그리지 않습니다. 요즘에는 "그래픽"이라는 이름을 지정하지 않으면 실수가 될 수 있지만 실제로는 "그래픽 그리기" 및 "그래프 없음" 모드로 생각하는 것이 더 좋습니다. ☺ - ...가상 터미널 전환을 협상합니다(해당되는 경우). 이는
VT_SETMODE
ioctl()
통화에 사용되는 가상 단말기가 전환되거나 멀어질 때 신호를 수신하도록 준비하는 데 사용할 수 있는 프로그램 에 의해 수행됩니다 .ioctl()
- ...커널 터미널 에뮬레이터와 입력 처리를 협상합니다.
- Linux에서는 입력 이벤트 하위 시스템에서 직접 데이터를 읽을 수 있습니다. 이 경우 프로그램은 커널의 터미널 에뮬레이터에 동일한 입력 이벤트의 복사본 읽기를 중지하고 이를 문자로 변환하는 것을 중지하고 전송을 중지하도록 지시합니다. 라인 규율을 입력으로 사용합니다. 이를 수행하는 방법에는 여러 가지가 있습니다.
- 초기 방법은 을 사용하여
KDSKBMODE
ioctl()
가상 터미널을K_RAW
모드로 전환하는 것입니다. 이 모드에서 커널 터미널 에뮬레이터는 여전히 커널의 입력 이벤트 하위 시스템에서 입력 이벤트를 수신하지만 이에 대한 처리를 수행하지 않고 대신 문자 입력으로 라인 규칙에 전달합니다. 그러나 이 메커니즘(입력 이벤트 하위 시스템이 존재하기 전에 X가 작동했던 방식에 뿌리를 두고 있음)은 입력이 여전히 라인 규칙으로 전송되고 여전히 배수되어야 하기 때문에 손상됩니다. 그리고termios
터미널의 입력 상태도 원시 모드여야 합니다. 그렇지 않으면 원시 스캔 코드가 라인 규칙에 의해 STOP 또는 INTR 문자와 같은 특수 문자로 오해됩니다. - 한때 더 나은 것으로 간주되었던 방법은
KDSKBMODE
ioctl()
스위치 가상 터미널을K_OFF
모드로 사용하는 것이었습니다. 이 모드에서 커널 터미널 에뮬레이터는 입력 이벤트를 처리할 뿐만 아니라 라인 규칙으로 보내지도 않습니다. 그러나 이 메커니즘은K_OFF
/// 모드 스위치K_RAW
의 일부 이기 때문에 손상되었습니다 . systemd 및 기타 유사한 시스템은 가상 터미널 모드를 관리하고 결국 가상 터미널을 전환합니다.K_CODE
K_XLATE
나가모드K_OFF
. - 요즘 더 나은 접근 방식은 로고를 사용하는 것입니다
KDSKBMUTE
. 그러면 모든 입력 이벤트 처리가 꺼집니다.아니요K_RAW
//K_CODE
모드K_XLATE
스위치에 영향을 받거나 영향을 받습니다.
- 초기 방법은 을 사용하여
- FreeBSD/PC-BSD에는 애초에 별도의 입력 이벤트 문자 장치가 없습니다. 하나는 커널 가상 터미널을 통해 키보드 입력을 읽는 것입니다.그래도
K_RAW
, 따라서 스캔코드( ) 또는 키코드( ) 모드 로 전환하고 싶을 수도 있지만K_CODE
끄고 싶지는 않습니다.
- Linux에서는 입력 이벤트 하위 시스템에서 직접 데이터를 읽을 수 있습니다. 이 경우 프로그램은 커널의 터미널 에뮬레이터에 동일한 입력 이벤트의 복사본 읽기를 중지하고 이를 문자로 변환하는 것을 중지하고 전송을 중지하도록 지시합니다. 라인 규율을 입력으로 사용합니다. 이를 수행하는 방법에는 여러 가지가 있습니다.
여기에는 약간의 상호 작용이 있습니다. 예를 들어, X 서버는 가상 터미널을 키코드 모드로 전환하고, 키코드를 읽고 이를 X 키 기호로 변환한 다음 X 키보드 처리 메커니즘을 통해 전달합니다. 이는 커널에 내장된 터미널 에뮬레이터가 Alt+키보드 시퀀스의 특별한 처리를 수행할 수 없음을 의미합니다. X 서버는 ++ 자체를 인식해야 합니다.FnCtrlAltFn
추가 읽기
- 아서 테일러(2013-02-02). systemd는 X가 있는 VT에서 KDSKBMODE를 호출해서는 안 됩니다.. systemd - 개발.
- 아담 잭슨(2012-11-16). [패치] vt: VC_MUTE에 대한 K_OFF 제거. 리눅스 커널 메일링 리스트.
- 아담 잭슨(2012-11-16). [패치] linux: ioctl(KDSKBMODE, K_OFF)보다 ioctl(KDSKBMUTE, 1)을 선호합니다.. xorg-dev.
- 마이클 K. 존슨(1994-06-01).리눅스 프로그래밍 팁. 리눅스 매거진.