当您从“此窗口可能正忙并且没有响应...”对话框中终止程序时,会发送什么信号?

当您从“此窗口可能正忙并且没有响应...”对话框中终止程序时,会发送什么信号?

在 XUbuntu 中,如果带有 GUI 窗口的程序冻结,我可能会收到警报:“此窗口可能正忙且没有响应。您想终止该应用程序吗?”

如果我单击终止,会向程序发送什么信号?它是仅发送到无响应的进程,还是也发送到其所有子进程、线程或子进程甚至其父进程?所有 Linux 发行版的行为是否标准化?

相关问题: 故意创建一个不响应`_NET_WM_PING`的图形进程

答案1

它使用SIGKILL,强制终止任何进程(除了不间断睡眠的进程或僵尸进程)。为了终止该进程下的所有子进程,可以向进程组中的所有进程发送信号。这是通过指定负 PID 来完成的。例如,如果 1234 无响应,则可以使用 杀死它及其子级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));
}

相关内容