我知道当我按下 Ctrl-C 时,操作系统 pts 系统会解释它并将 a 发送SIGINT
到前台进程组。我只是想知道它是如何通过tmux
.
假设我正在运行带有 X 服务器和窗口管理器的普通 Linux。我打开了xterm
一个zsh
正在运行的tmux
. 在这方面,tmux
我正在运行 abash
并在其中运行a ./a.out
。
进程树像window manager
-> xterm
-> zsh
-> tmux client
。然后tmux server
-> bash
-> ./a.out
。
因此,当我在键盘上按下 Ctrl-C 时,X 服务器首先捕获它并告诉活动窗口xterm
“嘿,这家伙只是按下了 Ctrl-C”。通过向伪终端发送一个“Ctrl-C”字符,xterm
告诉它直接运行的进程 ( zsh
) 我按下了 Ctrl-C pts/0
。操作系统在伪终端中看到“Ctrl-C”字符并将其转换为 aSIGINT
到前台进程组(即zsh
和tmux client
)。然后tmux client
必须已收到此SIGINT
所以它告诉tmux server
并tmux server
然后发送SIGINT
到它刚刚创建(与伪终端的前台进程组bash
和./a.out
在它)。对不起,如果这一切看起来令人困惑。但由于tmux
工作原理,tmux server
以及tmux client
是两个独立的过程。
现在,如果我想模仿这种行为,我可以只发送一个SIGINT
totmux client
并期望./a.out
收到一个SIGINT
,就好像我只是在键盘上按下了“Ctrl-C”。但什么也没有发生。我想我在某个地方错了,你能帮我吗?
小智 0
当Ctrl-C
发送时tmux
,客户端永远不会涉及信号。
tmux client
设置pts/0
为所谓的原始模式。在这种模式下
Ctrl-C
不会导致内核发送信号,而只是作为字符传递出去。然后将击键转发到tmux server
. 服务器正在运行自己的伪终端,例如pts/1
,其中 Ctrl-C 将导致发送信号。
因此,发送SIGINT
到与在正在运行的终端中tmux client
按下具有不同的效果。Ctrl-C
tmux client
将 pts 设置为原始模式可以在client.c的 tmux 源代码中找到。有趣的函数是cfmakeraw
和tcsetattr
,请参阅man 3 termios
以获得更多信息。
(这类似于通过交互式 ssh 会话发送 Ctrl-C 时发生的情况,请参阅此答案)。
归档时间: |
|
查看次数: |
1483 次 |
最近记录: |