「このウィンドウは使用中で応答しなくなる可能性があります...」ダイアログでプログラムを終了すると、どの信号が送信されますか?

「このウィンドウは使用中で応答しなくなる可能性があります...」ダイアログでプログラムを終了すると、どの信号が送信されますか?

XUbuntuでGUIウィンドウを含むプログラムが停止すると、「このウィンドウが使用中または応答しなくなる可能性があります。アプリケーションを終了しますか?」という警告が表示されることがあります。

「終了」をクリックすると、プログラムにどの信号が送信されますか?応答しないプロセスにのみ送信されますか、それともすべての子プロセス、スレッド、子プロセス、または親プロセスに送信されますか?すべてのLinuxディストリビューションで動作が標準化されていますか?

関連質問: `_NET_WM_PING`に応答しないグラフィックプロセスを意図的に生成

答え1

すべてのプロセスを強制終了するために使用されますSIGKILL(継続待機中のプロセスまたはゾンビプロセスを除く)。このプロセスのすべての子プロセスを終了するために、プロセスグループ内のすべてのプロセスにシグナルを送信できます。これは負のPIDを指定することで行われます。たとえば、1234が応答しない場合は、kill itとその子孫を使用できますkill(-1234, SIGKILL)。ただし、Xfceはこの信号をプロセスグループ全体に送信するのではなく、ウィンドウがあるプロセスにのみ送信するようです。

これはSIGKILLプロセスを終了する厳しい方法です。ほとんどのシグナルとは異なり、シャットダウンシグナルを受信したプロセスはシグナルを受信した後に実行するクリーンアップルーチンを設定できないため、ファイルへの書き込み中にシャットダウンされ、ファイルが破損する可能性があります。


存在するhelper-dialog/helper-dialog.c:83、あなたが見たメッセージは次のとおりです。

dialog = gtk_message_dialog_new (NULL, 0,
                                 GTK_MESSAGE_WARNING,
                                 GTK_BUTTONS_YES_NO,
                                 _("This window might be busy and is not responding.\n"
                                   "Do you want to terminate the application?"));

terminateShowDialog()ダイアログボックスは、独自に関数を呼び出す関数でトリガされますterminateProcessIO()。どちらも定義されています。src/terminate.c。次に、定義されたをterminateProcessIO()呼び出します。clientTerminate()src/client.c:2730。ここで使用されているものを見ることができますSIGKILL

if (kill (c->pid, SIGKILL) < 0)
{
    g_warning ("Failed to kill client id %d: %s", c->pid, strerror (errno));
}

関連情報