가끔 창 관리자가 응답하지 않는 응용 프로그램을 어떻게 처리하는지 궁금합니다._NET_WM_PING
예를 들어 팝업 창에는 '이 애플리케이션을 종료하시겠습니까?"이것은디버그 그래픽 애플리케이션그리고 방법을 배우세요다양한 애플리케이션이 다양한 신호를 처리합니다.그리고다양한 창 관리자 애플리케이션과 상호작용.
예를 들어:
kwin
가지다Client::pingWindow()
기능, 그리고 "이 애플리케이션을 종료하시겠습니까?" 정보.mutter
가지다meta_display_ping_window
기능, 그리고 "애플리케이션이 응답하지 않습니다." 정보.xfwm4
하나 있다clientSendNetWMPing
기능을 표시하고"이 창은 사용 중이거나 응답하지 않을 수 있습니다."정보.
strace
예를 들어 수신되는 신호를 확인하기 위해 응답하지 않는 프로그램을 실행할 수 있도록 이러한 동작을 의도적으로 트리거하고 싶습니다 . 저는 Python/Tkinter 또는 bash/zenity 스크립팅을 고려하고 있지만 다른 가능성도 열려 있습니다. 이상적으로는 이 프로그램이 CPU를 포화시키지 않지만 그것도 문제가 되지 않습니다. (이렇게 해도 SIGSTOP
창 관리자의 원하는 동작이 실행되지는 않습니다.)
_NET_WM_PING
의도적으로 응답하지 않는 그래픽 프로세스를 만들어 창 관리자의 주의를 끌 수 있는 쉽고 안정적인 방법이 있습니까 ?
답변1
정확한 대답은 프레임워크 등에 따라 다릅니다.
모든 GUI 프레임워크의 공통 "스레드"는 다시 그리기, 키보드 및 마우스 입력 등과 같은 이벤트/요청을 수신하는 중앙/주 이벤트 핸들러입니다.
while true; do nothing; done
이것이 바로 응답하지 않지만 긴밀한 루프에 있는 이벤트를 처리하는 핸들러입니다 .
답변2
몇 줄의 코드로 GUI 애플리케이션을 녹아웃하고 신호를 포착하는 것으로 래핑할 수 있습니다. Python에 대한 Tkinter의 주장은 매우 간단합니다. 바라보다여기
답변3
다음은 창을 생성하고 고정하는 빠르고 더러운 C++ 코드입니다.
// freeze.cpp
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCore/QMutex>
int main (int argc, char** argv) {
QApplication a (argc, argv);
QMainWindow w;
QMutex m;
w.show ();
m.lock ();
m.lock ();
return (a.exec ());
}
이는 Qt5 프레임워크에 따라 다릅니다. Qt5 개발 패키지를 설치한 후 다음 명령줄을 사용하여 코드를 컴파일할 수 있습니다(실제로 이는 Qt 애플리케이션을 빌드하는 올바른 방법이 아닙니다).
$ g++ freeze.cpp -fPIC -std=c++11 -I/usr/include/qt5 -I/usr/include/qt -lQt5Core -lQt5Gui -lQt5Widgets
답변4
zenity
해당 속성이 있는 원하는 _NET_WM_PING
X 응용 프로그램 으로 바꾸십시오 .
#!/bin/bash
zenity --question &
sleep 5
kill -STOP $!
X 응용 프로그램의 PID가 사라지도록 하려면 를 사용하여 X 응용 프로그램의 PID를 kill -CONT xxxx
바꿔야 합니다 .xxxx
xprop | grep _NET_WM_PING # Click on the zenity GTK dialog
WM_PROTOCOLS(ATOM): protocols WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST