창을 닫은 후 X 클라이언트 응용 프로그램 프로세스를 종료해야 합니까?

창을 닫은 후 X 클라이언트 응용 프로그램 프로세스를 종료해야 합니까?

X 클라이언트 응용 프로그램의 창이 닫히면 응용 프로그램 프로세스가 종료됩니까(성공 또는 실패에 관계없이 종료 시도만 가능)?

지원 절차가 종료된 경우, 종료 절차를 어떻게 알릴 수 있나요? 특정 신호에 따라 기본 작업은 프로세스를 종료하는 것입니다. 그렇다면 신호를 보내는 것은 무엇입니까?

감사해요.

답변1

너무 길어요 박사님;X11 프로토콜에는 프로세스, 신호 또는 모든 종류의 IPC에 대한 개념이 없습니다. 서버와 클라이언트는 프로세스에 대한 개념이 전혀 없을 수 있는 다른 시스템 및 운영 체제에 있을 수 있습니다. Lisp 기계는 여전히 중요했습니다.) X11 프로토콜 자체는 Unix 소켓, tcp/ip를 통해 실행되거나 SSH 등을 통해 터널링될 수 있습니다.

X11 창을 "닫는" 방법에는 세 가지가 있습니다.

  1. ClientMessage원자가 포함된 이벤트를 WM_DELETE_WINDOW이 창으로 보냅니다. 창을 생성한 응용 프로그램은 이에 대한 작업을 수행하거나(예 xclock: xeyes창을 직접 종료하고 다른 응용 프로그램은 창을 닫고 계속 실행할 수 있음) 창을 무시할 수 있습니다. X이는 일반적으로 버튼을 누르 거나 일부 "표준" 키 조합(예 Alt-F4: .

  2. 강제로 창문을 파괴하세요 XDestroyWindow. 응용 프로그램은 이를 예상하지 못할 수 있으며 DestroyNotify이벤트를 무시하고 여전히 존재하는 것처럼 창에서 작업을 수행하려고 시도할 수 있으며 이로 인해 Xlib의 기본 오류 처리기 ( 를 사용하여 XErrorEvent설정 )가 인쇄됩니다. BadWindow이 경우에는 오류 메시지를 표시하고 XSetErrorHandler정리합니다 .exit(3)

  3. 이 창을 호출 XKillClient하면 창을 생성한 클라이언트가 강제로 닫힙니다(창 대신 XIDpixmap과 같은 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 -framewm, 업무에 사용해야 합니다 .

답변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창을 강제로 닫을 수 있음).

관련 정보