当X客户端应用程序的窗口关闭时,是否必然会终止该应用程序进程(仅尝试终止,无论成功或失败)?
当终止应用程序进程时,如何通知进程终止?通过某个信号,其默认操作是终止进程,如果是,那么是什么发送信号?
谢谢。
答案1
太长;博士;X11 协议没有进程、信号或任何类型的 IPC 的概念;服务器及其任何客户端都可能位于不同的机器和操作系统上,这可能根本就没有进程的概念(在设计 X11 协议时,Lisp 机器仍然是一个东西)。 X11 本身协议可以运行在 unix 套接字、tcp/ip 之上或通过 ssh 等进行隧道传输。
有 3 种方法可以“关闭”X11 窗口:
ClientMessage
将带有原子的事件发送WM_DELETE_WINDOW
到该窗口。创建该窗口的应用程序可以对其进行操作(例如xclock
,xeyes
将直接退出;其他应用程序可以关闭该窗口并继续运行)或者可以忽略它。当您按下X
按钮或按下某些“标准”组合键(例如 )时,通常会发生这种情况Alt-F4
。用 强力摧毁该窗口
XDestroyWindow
。应用程序可能不会期望它,并且可能会忽略任何DestroyNotify
事件,并且仍然尝试在该窗口上执行操作,就好像它仍然存在一样,这将导致它收到一个XErrorEvent
代码设置为BadWindow
. Xlib 中的默认错误处理程序(使用 进行设置)将打印错误消息并在这种情况下XSetErrorHandler
进行清理。exit(3)
调用
XKillClient
该窗口,它将强制关闭创建它的客户端(而不是窗口,您可以使用任何 X11 资源,例如XID
像素图的)。这就是[1]。这与或xkill(1)
无关,并且不会向任何进程发送任何信号。除非客户端采取了特殊措施(参见),否则它创建的所有资源(窗口、像素图、图形上下文)都将被销毁。同样,默认的 Xlibkill(2)
kill(1)
XSetCloseDownMode(3)
io在这种情况下,错误处理程序(使用 进行设置XSetIOErrorHandler
)将打印错误消息并进行清理。exit(3)
与 pt 的区别。 2.是用XSetIOErrorHandler
can设置的handler不是返回。
有些应用程序非常烦人地将 2. 和 3. 视为“崩溃”(例如,firefox 将在下次启动时显示臭名昭著的“这太尴尬了”消息,除非browser.sessionstore.resume_from_crash
设置为 false)。
此外,应用程序无法知道它是否被服务器踢出,XKillClient
或者服务器本身是否意外关闭或崩溃。
另一件值得重复的事情是 X11 协议是合作社按设计; X11客户端之间没有障碍和检查;任何客户端都可以使用 踢出任何其他客户端XKillClient
、销毁窗口或调整其窗口大小、将键盘或鼠标全部留给自己、设置覆盖重定向标志以使窗口管理器不受影响等。
[1] 除非您使用的是重新养育wm,你应该使用xkill -frame
它才能工作。
答案2
首先,X 客户端可以打开多个窗口;X 客户端的“那个”窗口并不存在。
(客户端)Xlib 函数x销毁窗口也可以由窗口管理器 (WM) 调用,告诉 X 服务器销毁特定窗口。然后,X 服务器从其内部数据结构中删除该窗口,并向DestroyNotify
客户端发送一个事件。客户端可以处理此事件,例如减少当前使用的窗口的计数器等。
基本上所有 X 工具包库都提供某种主事件循环以及退出该主循环的某种方法。例如,Xt 工具包有XtAppMainLoop
,并且手册页显示
应用程序可以提供自己的循环版本,该循环会测试某些全局终止标志或测试顶级小部件的数量是否大于零,然后再循环回对
XtAppNext
Event 的调用。
因此,必须正确编程应用程序才能终止;没有什么可以阻止它在没有窗口的情况下继续运行。事实上,一些 X 命令行工具是不使用任何 Windows 的 X 客户端应用程序。
所描述的机制用于 WM 的情况强迫要关闭的窗口。正常的方式是WMWM_DELETE_WINDOW
向客户端发送消息,客户端可以以任何它选择的方式对该消息做出反应。例如,它可以弹出一个确认对话框(“真的退出这个程序吗?”),如果用户确认,它可以清理所有内容并退出。这是您在大多数 X 编程示例中都会看到的推荐行为。但同样,没有什么可以阻止客户端完全忽略此消息(在这种情况下,WM 可以用来xdestroywindow
强制窗口关闭)。