Ctrl-C 如何通过 tmux 传播

Hot*_*PxL 8 linux tmux

我知道当我按下 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到前台进程组(即zshtmux client)。然后tmux client必须已收到此SIGINT所以它告诉tmux servertmux server然后发送SIGINT到它刚刚创建(与伪终端的前台进程组bash./a.out在它)。对不起,如果这一切看起来令人困惑。但由于tmux工作原理,tmux server以及tmux client 是两个独立的过程。

现在,如果我想模仿这种行为,我可以只发送一个SIGINTtotmux 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-Ctmux client

将 pts 设置为原始模式可以在client.c的 tmux 源代码中找到。有趣的函数是cfmakerawtcsetattr,请参阅man 3 termios以获得更多信息。

(这类似于通过交互式 ssh 会话发送 Ctrl-C 时发生的情况,请参阅此答案)。