`_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

関連情報