`_NET_WM_PING`에 응답하지 않는 그래픽 프로세스를 의도적으로 생성

`_NET_WM_PING`에 응답하지 않는 그래픽 프로세스를 의도적으로 생성

가끔 창 관리자가 응답하지 않는 응용 프로그램을 어떻게 처리하는지 궁금합니다._NET_WM_PING예를 들어 팝업 창에는 '이 애플리케이션을 종료하시겠습니까?"이것은디버그 그래픽 애플리케이션그리고 방법을 배우세요다양한 애플리케이션이 다양한 신호를 처리합니다.그리고다양한 창 관리자 애플리케이션과 상호작용.

예를 들어:

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_PINGX 응용 프로그램 으로 바꾸십시오 .

#!/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

관련 정보