是否必须在关闭 X 客户端应用程序进程的窗口之后终止该进程?

Tim*_*Tim 3 process x11 window

当 X 客户端应用程序的窗口关闭时,是否一定要终止应用程序进程(只尝试终止,而不管失败是否成功)?

当随后终止应用程序进程时,如何通知进程终止?通过一些默认操作是终止进程的信号,如果是,什么发送信号?

谢谢。

mos*_*svy 7

tl;博士; X11 协议没有进程、信号或任何类型的 IPC 的概念;服务器和它的任何客户端都可能在不同的机器和操作系统上,它们可能根本没有进程的概念(在设计 X11 协议时,Lisp 机器仍然是一个东西)。X11 本身的协议可以运行在 unix 套接字、tcp/ip 之上或通过 ssh 等隧道传输。

有 3 种方法可以“关闭”X11 窗口:

  1. ClientMessage带有WM_DELETE_WINDOW原子的事件发送到该窗口。创建该窗口的应用程序可能会对其进行操作(例如xclockxeyes将退出;其他应用程序可能会关闭该窗口并继续运行)或可能会忽略它。当您按下X按钮或按下某些“标准”组合键时,通常会发生这种情况Alt-F4

  2. 用 强行销毁该窗口XDestroyWindow。应用程序可能不期望它并可能忽略任何DestroyNotify事件,并且仍然尝试在该窗口上执行操作,就好像它仍然存在一样,这将导致它收到XErrorEvent代码设置为BadWindow. Xlib 的默认错误处理程序(设置为XSetErrorHandler)将打印错误消息并exit(3)在这种情况下进行清理。

  3. 调用XKillClient该窗口,这将强制关闭创建它的客户端(而不是窗口,您可以使用任何 X11 资源,例如XID像素图的)。这就是xkill(1)[1]。这与kill(2)kill(1)不向任何进程发送任何信号无关。除非客户端采取了特殊措施(请参阅XSetCloseDownMode(3)参考资料),否则它创建的所有资源(窗口、像素图、图形上下文)都将被销毁。同样,在这种情况下,默认的 Xlib io错误处理程序(设置为XSetIOErrorHandler)将打印错误消息并进行清理exit(3)。与pt的区别。2.是,处理程序中设置与XSetIOErrorHandler不能回来。

一些应用程序非常烦人地将 2. 和 3. 视为“崩溃”(例如,firefox 将在下次启动时显示其臭名昭著的“这很尴尬”消息,除非browser.sessionstore.resume_from_crash设置为 false)。

此外,应用程序无法知道它是否被服务器踢出,XKillClient或者服务器本身是否意外关闭或崩溃。

另一件值得重申的事情是 X11 协议在设计上是协作的;X11客户端之间没有障碍和检查;任何客户端都可以用 踢出任何其他客户端XKillClient,破坏或调整其窗口大小,将键盘或鼠标全部抓到自己身上,设置覆盖重定向标志以使窗口管理器不受影响,等等。

[1] 除非您使用的是重新养育wm,否则您应该使用xkill -frame它来工作。