bash – 详细地说,当您在终端中按Ctrl-C时会发生什么?
详细说明,在终端中按Ctrl-C会发生什么?是的,我知道它发送了SIGINT,但是到达那里需要采取哪些步骤?
我做了一些研究,所以我认为我理解了大部分的图片,但不是全部. 为了教学,我假设我们在X会话中运行终端模拟器xterm.终端正在运行Bash shell,并且shell当前正在运行一些由前台中的多个进程组成的长时间运行的管道. >我按下键盘上的Ctrl-C. 我的问题是,到目前为止我的理解是否正确,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并让你挂起的方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |