netstat 输出中的 lxterminal

xra*_*alf 2 networking socket netstat lxterminal

你能解释netstat输出中的以下几行吗?

Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path

unix  2      [ ]         STREAM     CONNECTED     37133819 /tmp/.lxterminal-socket:0-xralf
unix  2      [ ]         STREAM     CONNECTED     37109191 /tmp/.lxterminal-socket:0-xralf
Run Code Online (Sandbox Code Playgroud)

Jde*_*eBP 7

客户端-服务器 GUI 程序

与当今的其他几个 GUI 程序一样,自 2008 年以来,lxterminal已尝试从单个进程显示所有终端仿真器窗口,每个用户每个 X 显示一个。为此,它会尝试通过您看到的名称类型连接到现有套接字,该名称包含显示名称和您的用户名。

  • 如果连接成功,它只是将其当前目录和参数向量转储到套接字并退出。它不使用文件描述符传递将打开的文件描述符直接传递到其当前目录,而是按名称传递它。
  • 如果连接失败,它会尝试自己成为该套接字上的侦听服务器。它读取包含当前目录和参数向量的消息,并为每次读取打开一个新的 GUI 终端仿真窗口,就好像它是它自己的当前目录和参数向量一样。

这样做的可见效果是lxterminal您调用(并保持运行)的第一个程序同步运行,而第二个和后续程序则不然。要观察这一点,从没有 lxterminal运行的实例开始,运行不同的终端模拟器,然后调用

lxterminal & sleep 1 ; 终端
从一个壳。shell 将在 1 秒后返回提示符,并显示仅剩下 1 个lxterminal作业正在运行。

rxvt 具有类似的功能,但必须显式调用urxvtd服务器,并显式运行urxvtc客户端。运行普通urxvt不会尝试任何客户端 - 服务器的恶作剧。

相比之下,GNOME 终端只能以这种方式工作。它总是将参数向量传递给服务器进程,然后退出。此外,每个用户只有一个服务器进程,处理所有显示(以及此机制初始化、启动的方式中的错误)。

不安全感

/tmp使用可预测的名称创建文件和套接字是一个众所周知的安全问题,并lxterminal共享它。用户可以在可预测的位置预先创建套接字,lxterminal在同一台机器上运行的其他用户将尝试与之交谈。

相比之下,rxvt 使用每个用户主目录的非组可写非其他可写子目录。解决此问题的另一种可能性lxterminal同样不允许其他用户使用他们的套接字替换自己的套接字的方法是将套接字放入./run/user/username/lxterminal

(GNOME 终端使用用户级桌面总线在客户端与其服务器之间进行通信。如今,它的AF_LOCAL套接字位于其他非特权用户无法替代的地方。)/run/user/username/

错误

困扰 GNOME 终端的问题之一是它在单个服务器进程中为终端仿真的每个实例占用了大量打开的文件描述符。它曾经是 16;现在下降到“仅仅”8。

lxterminal使用 2,其中之一是来自客户端进程的套接字连接的泄漏打开文件描述符。打开和关闭足够多的终端仿真,最终lxterminal将耗尽可用的文件描述符。以下从没有lxterminal运行实例开始,在我的一台机器上在一分钟多的时间内用完了服务器的所有可用文件描述符:

(ulimit -H -n 1024 ; lxterminal) &
seq 0 1024 | 读取时 -ri ; 做 lxterminal -e /usr/bin/true ; 完毕

进一步阅读