终端仿真器进程是服务器吗?
如果是,其客户是什么?我怎样才能找到它的客户?谢谢。
netstat
输出包含 lxterminal 进程。这是否意味着终端仿真器进程是基于unix域套接字的服务器?$ sudo netstat -ap | grep -i lxterminal [sudo] password for t: unix 2 [ ACC ] STREAM LISTENING 28665 1480/lxterminal /run/user/1000/.lxterminal-socket-:0 unix 3 [ ] STREAM CONNECTED 28663 1480/lxterminal unix 3 [ ] STREAM CONNECTED 28661 1480/lxterminal unix 3 [ ] STREAM CONNECTED 28666 1480/lxterminal
服务器始终(或通常?)守护进程,因此它没有控制终端。 lxterminal 没有 (
?
):$ ps aux | grep -i lxterminal t 1480 0.1 0.3 473204 28232 ? Sl Nov21 22:39 lxterminal
答案1
AX 服务器之所以是服务器,是因为它为应用程序提供显示和输入设备。
应用程序例如lxterminal
连接到 X 服务器来请求某些服务。例如:
- 请画一个该形状和大小的窗户
- 请告诉我用户按下和释放哪个键
它们通过 UNIX 域或 ABSTRACT 或 TCP 套接字连接到 X 服务器。
类似地,终端仿真器可以被视为终端应用程序的服务器。
有了echo test > /dev/pts/12
,echo
应用程序可以被视为连接到终端模拟器(通过伪终端而不是网络套接字,尽管这里联系是通过 shell 重定向完成的,而不是echo
) 并请求服务:请显示测试并将光标向下移动。
现在,包括 gnome-terminal 和 lxterminal 在内的一些终端模拟器具有(令人讨厌的 IMO)功能,在第一次调用时,它们会启动一个守护进程来处理未来打开新终端窗口的请求。
稍后调用这些连接到该服务器(/run/user/1000/.lxterminal-socket-:0
在您的情况下使用该 UNIX 域套接字)来请求新的终端窗口,大概是为了节省资源或以便可以在终端窗口之间共享某些信息。
当你这样做时:
cd /tmp && lxterminal -e vim
虽然已经有一个lxterminal
正在运行,但第二次调用只是告诉服务器在新窗口中lxterminal
运行,并将当前目录更改为.vim
/tmp
请参阅xterm
或rxvt
以更传统方式工作的终端仿真器。
实际上你也可以这样做:
printf '%s\0' /tmp lxterminal -e vim |
socat -u - 'unix-connect:"/run/user/1000/.lxterminal-socket-:0"'
我觉得这很烦人,因为这意味着只有第一次调用才会继承调用者的环境(全局意义上的环境,包括umask
, cwd
, env vars...),以后的调用只能获得 cwd。
更多关于@JdeBP's Fine Answer的内容netstat 输出中的 lxterminal