X 클라이언트 응용 프로그램의 창이 닫히면 응용 프로그램 프로세스가 종료됩니까(성공 또는 실패에 관계없이 종료 시도만 가능)?
지원 절차가 종료된 경우, 종료 절차를 어떻게 알릴 수 있나요? 특정 신호에 따라 기본 작업은 프로세스를 종료하는 것입니다. 그렇다면 신호를 보내는 것은 무엇입니까?
감사해요.
답변1
너무 길어요 박사님;X11 프로토콜에는 프로세스, 신호 또는 모든 종류의 IPC에 대한 개념이 없습니다. 서버와 클라이언트는 프로세스에 대한 개념이 전혀 없을 수 있는 다른 시스템 및 운영 체제에 있을 수 있습니다. Lisp 기계는 여전히 중요했습니다.) X11 프로토콜 자체는 Unix 소켓, tcp/ip를 통해 실행되거나 SSH 등을 통해 터널링될 수 있습니다.
X11 창을 "닫는" 방법에는 세 가지가 있습니다.
ClientMessage
원자가 포함된 이벤트를WM_DELETE_WINDOW
이 창으로 보냅니다. 창을 생성한 응용 프로그램은 이에 대한 작업을 수행하거나(예xclock
:xeyes
창을 직접 종료하고 다른 응용 프로그램은 창을 닫고 계속 실행할 수 있음) 창을 무시할 수 있습니다.X
이는 일반적으로 버튼을 누르 거나 일부 "표준" 키 조합(예Alt-F4
: .강제로 창문을 파괴하세요
XDestroyWindow
. 응용 프로그램은 이를 예상하지 못할 수 있으며DestroyNotify
이벤트를 무시하고 여전히 존재하는 것처럼 창에서 작업을 수행하려고 시도할 수 있으며 이로 인해 Xlib의 기본 오류 처리기 ( 를 사용하여XErrorEvent
설정 )가 인쇄됩니다.BadWindow
이 경우에는 오류 메시지를 표시하고XSetErrorHandler
정리합니다 .exit(3)
이 창을 호출
XKillClient
하면 창을 생성한 클라이언트가 강제로 닫힙니다(창 대신XID
pixmap과 같은 X11 리소스를 사용할 수 있음). [1] 입니다. 이는xkill(1)
또는 아무 관련이 없으며 어떤 프로세스에도 신호를 보내지 않습니다. 클라이언트가 특별한 조치를 취하지 않는 한(참고자료 참조) 클라이언트가 생성하는 모든 리소스(창, 픽스맵, 그래픽 컨텍스트)는 삭제됩니다. 마찬가지로, 기본 Xlibkill(2)
kill(1)
XSetCloseDownMode(3)
이오이 경우 오류 처리기( 로 설정XSetIOErrorHandler
)는 오류 메시지를 인쇄하고 정리합니다.exit(3)
pt와의 차이점 2.XSetIOErrorHandler
캔이 포함된 핸들러 세트 입니다 .아니요반품.
일부 응용 프로그램은 2.와 3.을 "충돌"로 매우 성가시게 처리합니다(예: Firefox는 false로 설정하지 않는 한 다음 실행 시 악명 높은 "이건 너무 창피합니다"라는 메시지를 표시합니다 browser.sessionstore.resume_from_crash
).
또한 애플리케이션은 서버에서 쫓겨났는지 XKillClient
또는 서버 자체가 예기치 않게 종료되거나 충돌했는지 알 수 없습니다.
반복할 가치가 있는 또 다른 사실은 X11 프로토콜이협력적인설계상 X11 클라이언트 사이에는 장벽과 검사가 없습니다. 모든 클라이언트는 다른 클라이언트를 쫓아낼 수 있고 XKillClient
, 창을 파괴하거나 크기를 조정할 수 있으며, 키보드나 마우스를 모두 사용할 수 있고, 창 관리자를 사용하도록 재정의 리디렉션 플래그를 설정할 수 있습니다. .
[1] 사용하지 않는 한재육아xkill -frame
wm, 업무에 사용해야 합니다 .
답변2
첫째, X 클라이언트는 여러 개의 창을 열 수 있습니다. X 클라이언트에 대한 "해당" 창은 존재하지 않습니다.
(클라이언트) Xlib 기능xdestroy 창X 서버에게 특정 창을 삭제하라고 지시하기 위해 창 관리자(WM)에 의해 호출될 수도 있습니다. 그런 다음 X 서버는 내부 데이터 구조에서 창을 제거하고 DestroyNotify
클라이언트에 이벤트를 보냅니다. 클라이언트는 현재 사용되는 창의 카운터를 줄이는 등 이 이벤트를 처리할 수 있습니다.
기본적으로 모든 X 툴킷 라이브러리는 일종의 메인 이벤트 루프와 해당 메인 루프를 종료하는 방법을 제공합니다. 예를 들어, Xt 툴킷에는 가 있고 XtAppMainLoop
매뉴얼 페이지에는 다음과 같습니다.
XtAppNext
애플리케이션은 일부 전역 종료 플래그를 테스트하거나 Event 호출 로 다시 루프하기 전에 최상위 위젯 수가 0보다 큰지 테스트하는 루프의 자체 버전을 제공할 수 있습니다 .
따라서 애플리케이션을 종료하려면 올바르게 프로그래밍해야 합니다. 창 없이 계속 실행되는 것을 방해하는 것은 없습니다. 실제로 일부 X 명령줄 도구는 Windows X 클라이언트 응용 프로그램에서 사용되지 않습니다.
설명된 메커니즘은 WM의 경우에 사용됩니다.힘닫을 창입니다. 일반적인 방법은 WM이 WM_DELETE_WINDOW
클라이언트에 메시지를 보내고 클라이언트가 선택한 방식으로 메시지에 반응할 수 있다는 것입니다. 예를 들어 확인 대화 상자("정말로 이 프로그램을 종료하시겠습니까?")를 표시할 수 있으며, 사용자가 확인하면 모든 것을 정리하고 종료할 수 있습니다. 이는 대부분의 X 프로그래밍 예제에서 볼 수 있는 권장 동작입니다. 그러나 클라이언트가 이 메시지를 완전히 무시하는 것을 막을 수 있는 방법은 없습니다(이 경우 WM을 사용하여 xdestroywindow
창을 강제로 닫을 수 있음).