在 XUbuntu 中,如果带有 GUI 窗口的程序冻结,我可能会收到警报:“此窗口可能正忙且没有响应。您想终止该应用程序吗?”
如果我单击终止,会向程序发送什么信号?它是仅发送到无响应的进程,还是也发送到其所有子进程、线程或子进程甚至其父进程?所有 Linux 发行版的行为是否标准化?
答案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));
}