gpt4 book ai didi

bash - 具体来说,当您在终端中按下 Ctrl-C 时会发生什么?

转载 作者:行者123 更新时间:2023-11-29 09:06:02 24 4
gpt4 key购买 nike

详细来说,当您在终端中按下 Ctrl-C 时会发生什么?是的,我知道它会发送 SIGINT,但它需要执行哪些步骤才能到达那里?

我做了一些研究,所以我想我理解了大部分图片,但不是全部。

为了教学起见,我假设我们在 X session 中运行终端仿真器 xterm。终端正在运行 Bash shell,该 shell 当前正在前台运行一些由多个进程组成的长时间运行的管道。

  1. 我在键盘上按 Ctrl-C。
  2. X 将键盘事件发送给 xterm。
  3. xterm 转换 Ctrl-C 键盘事件并将其发送到它持有的伪 tty 主文件描述符? (一些神奇的事情发生了)
  4. 内核检测到一些特殊的 SIGINT 事件发生在伪 tty 上,并找到控制终端是这个 tty 的 session 。它将 SIGINT 发送到该 session 的当前前台进程组,其中仅包括我们管道中的进程。

我的问题是,到目前为止我的理解是否正确,xterm 究竟如何告诉内核将 SIGINT 发送到具有给定控制终端的 session ?

最佳答案

tl;dr 是内核做的。

每个pty(伪tty)都有两端,master和slave。在 xterm 示例中,xterm 将持有主文件描述符。任何按键都直接写入主 fd。从属 fd(pts 或 pty slave)由一个 session 拥有,并传递给任何前台进程组。

每当将 ASCII ETX 字符 (^C) 写入 master 时,内核会将其转换为使用相应的控制终端向前台进程组发送 SIGINT。这实际上是一个 pty 设置。你可以运行stty -a,看到默认是intr = ^C;,意思是^C或者ETX是“SIGINT”字符.这可以更改为不同的字符或完全禁用。

一个更复杂的例子是 Ctrl-C 如何通过交互式 SSH session 工作。交互式 SSH session 在服务器端分配一个 pty。客户端 pty 设置为原始模式,这意味着客户端内核不会将 ETX 转换为 SIGINT。相反,客户端内核将 ETX 传递给从属设备。在这种情况下,ssh 客户端进程获取该 ETX 并将其传递给服务器 sshd 进程。如果服务器 sshd pty 不处于原始模式,则服务器的内核会将 ETX 转换为 SIGINT 到其前台进程组。这就是 Ctrl-C 将 SIGINT 发送到服务器上运行的进程的方式,而不是终止您的客户端 SSH 并让您挂起。

关于bash - 具体来说,当您在终端中按下 Ctrl-C 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45993444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com