终端仿真器、窗口管理器和 X 服务器进程之间的服务器-客户端关系是什么?

终端仿真器、窗口管理器和 X 服务器进程之间的服务器-客户端关系是什么?
  1. 在APUE(见下图)中,终端仿真器进程和窗口管理器(例如openbox)进程如何通信?终端仿真器进程是基于 Unix 域套接字的窗口管理器进程的客户端吗?
  2. X 服务器进程与终端仿真器进程和窗口管理器进程有什么关系?具体来说:

    xlsclients输出包含lxterminal.这是否意味着终端仿真器进程是 X 服务器的客户端?

    $ xlsclients -a |  grep -i lxterminal
    ocean  lxterminal
    

    xlsclients输出不包含窗口管理器进程。这是否意味着窗口管理器进程不是 X 服务器的客户端?

    $ xlsclients -a |  grep -i openbox
    $
    

在此输入图像描述

答案1

xlsclients是一个简单的应用程序,它列出了顶部窗口(即作为根窗口的子窗口或具有属性的窗口)上设置的WM_CLIENT_MACHINE和属性。WM_COMMANDWM_STATE

这就是它所做的一切。没有魔法。

例如,我正在使用自己的窗口管理器,它打开了一个InputOnly(不可见)窗口作为根窗口的子窗口,将其用于尤姆赫气象检查。如果我设置这两个属性,预期的事情就会发生;-)

$ xprop -id 0x400001 -f WM_CLIENT_MACHINE 8s -set WM_CLIENT_MACHINE kgbvax
$ xprop -id 0x400001 -set WM_COMMAND /sbin/reboot
$ $ xlsclients
kgbvax  /sbin/reboot
...

但回答你的问题:

终端仿真器进程和窗口管理器(例如 openbox)进程如何通信?终端仿真器进程是基于 Unix 域套接字的窗口管理器进程的客户端吗?

它们都是 X11 服务器的客户端,通常通过使用 XSendEvent(3) 发送客户端消息并在窗口上设置属性来进行通信。该协议描述于国际商会尤姆赫。请注意,客户端并没有“拥有”窗口;而是“拥有”窗口。任何客户端都可以在任何窗口上进行任何操作,包括但不限于设置和获取窗口的任何属性。

答案2

我不知道 APUE 是什么意思,谷歌搜索也没有找到任何有用的东西,但我可以为像xterm.虽然xterm只使用单个 shell 加上 PTY(例如图片的左侧部分),但没有什么可以阻止终端仿真器多次执行此操作(例如在选项卡式子窗口中),因此 APUE 可能就是这样的程序。

1) 终端仿真器只是一个普通的 X 应用程序,因此与 X 窗口管理器的通信方式与其他 X 应用程序相同:间接通过 X 服务器。这个细节很复杂,涉及 X 属性、X 事件和其他东西。它们不涉及任何类型的客户端-服务器关系(因为连接是间接的)或 Unix 域套接字。

2) 任何 X 应用程序,包括终端仿真器,都是一个客户X 的服务器,如果它们在同一台机器上运行,则通过 Unix 域套接字,如果不在同一台机器上则通过网络。是的,xlsclients正如其名称所暗示的那样,列出了它连接到的 X 服务器的所有客户端应用程序。

3) X 窗口管理器openbox只是一个 X 应用程序,它在连接到 X 服务器时执行一些特殊命令。所以 X 窗口管理器是客户X 的服务器(除非你坚持对“客户”有一个有趣的定义),并以与上述相同的方式进行沟通。如果xlsclients没有将其列在“客户端”下,那是因为 X 服务器以特殊方式对待它。我实际上不确定其机制(xlsclients可能会过滤掉它,或者 X 服务器本身可能会过滤掉它)。

编辑

X 客户端(至少根据我的观点)是任何打开到 X 服务器的连接的东西,即使它不显示窗口。 X 客户端也是如此xlsclients(只要它运行),查询 X 服务器的其他命令也是如此。

“控制终端”是一个完全独立的概念。您可以启动(至少最初)具有控制终端的 X 应用程序:如果您通过命令行启动它们,这是通常的情况。但是X应用程序也可以在没有控制终端的情况下启动,例如从X显示管理器,或者从其他X客户端(例如在没有控制终端的情况下启动的窗口管理器)。

相关内容