在Linux中,各个进程之间通过内核进行通信。据我所知,X11是一个服务器,这意味着它是一个进程。我在某处读到(不记得来源,稍后提供)本地进程使用Unix域套接字与X11通信,同时非本地进程使用TCP套接字。与X11服务器的通信协议为X11协议。
现在,我读自堆栈溢出我们使用的最终用户进程实际上并不是直接与 X11 通信,而是通过桌面环境和 Windows 管理器进行通信。
所以现在,我不确定用户端进程、桌面环境和窗口管理器如何相互通信。 (我不确定桌面环境和窗口管理器是否是进程。)
答案1
X11 是一个进程,其职责是监听输入设备并写入屏幕。 (它如何处理这个是另一个问题,相当复杂。)进程通过 Unix 或 TCP 套接字与 X11 通信,具体取决于配置(如果是 Unix 套接字,套接字文件通常位于/tmp/.X11-unix
)。任何处理 X 的进程都通过这些套接字之一与 X11 进行通信;通信本身没有中介(除非您使用非标准设置,例如 SSH 转发或 xpra)。
窗口管理器是一个单独的程序,它也在套接字上使用 X 协议与 X11 进行通信。它使用 X 提供的一组单独的 API,允许它向特定 X11 实例上的其他应用程序发出指令;它本身也可能发出绘图和输入请求,例如绘制窗口装饰(例如通常的最大化/最小化/关闭按钮和标题栏)或响应全局快捷方式(在现代系统上,通常在这里处理 Ctrl-Alt-Del) )。请注意,窗口管理器实际上只向其他 X 程序发出指令,而不是直接命令;如果程序采取一些特殊步骤,它们就能够忽略它们。 (对于合成窗口管理器,情况稍微复杂一些,因为它还处理作为应用程序中介的 X 服务器的实际图形渲染。)这里发生的所有通信都是通过使用 X 协议的套接字进行的。
桌面环境是一组执行各种操作的程序。通常窗口管理器包含在其中;它还可能包括一些图形配置器和实用程序、与桌面集成的文件管理器、显示各种状态更新的系统托盘等。其中大部分并不是特别神秘,只是更多的 X 程序呈现给 X 服务器。当它们必须相互通信时,它们使用自己的协议,通常使用某种套接字作为后端。最近,趋势已经不再是应用程序编写自己的协议,而是转向使用更高级别的元协议,例如dbus
.