加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 详细地说,当您在终端中按Ctrl-C时会发生什么?

发布时间:2020-12-15 22:39:44 所属栏目:安全 来源:网络整理
导读:详细说明,在终端中按Ctrl-C会发生什么?是的,我知道它发送了SIGINT,但是到达那里需要采取哪些步骤? 我做了一些研究,所以我认为我理解了大部分的图片,但不是全部. 为了教学,我假设我们在X会话中运行终端模拟器xterm.终端正在运行Bash shell,并且shell当前正
详细说明,在终端中按Ctrl-C会发生什么?是的,我知道它发送了SIGINT,但是到达那里需要采取哪些步骤?

我做了一些研究,所以我认为我理解了大部分的图片,但不是全部.

为了教学,我假设我们在X会话中运行终端模拟器xterm.终端正在运行Bash shell,并且shell当前正在运行一些由前台中的多个进程组成的长时间运行的管道.

>我按下键盘上的Ctrl-C.
> X将键盘事件发送到xterm.
> xterm翻译Ctrl-C键盘事件并将其发送到它所持有的伪tty主文件描述符? (有些魔法发生)
>内核检测到伪tty上发生了一些特殊的SIGINT事件,并找到控制终端为此tty的会话.它将SIGINT发送到该会话的当前前台进程组,该进程组仅包括我们管道中的进程.

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

解决方法

tl; dr内核做到了.

每个pty(伪tty)都有两个端点,一个是主服务器和一个从服务器.在xterm示例中,xterm将保留在主文件描述符上.任何按键都直接写入主fd.从属fd(pts或pty slave)由会话拥有并传递给前台进程组.

每当将ASCII ETX字符(^ C)写入主服务器时,内核将其转换为使用相应的控制终端将SIGINT发送到前台进程组.这实际上是一个pty设置.您可以运行stty -a并查看默认值为intr = ^ C ;,表示^ C或ETX是“SIGINT”字符.这可以更改为其他角色或完全禁用.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读