详细地说,当您在终端中按Ctrl-C时会发生什么?是的,我知道它发送SIGINT,但是到达那里需要采取什么步骤?
我做了一些研究,所以我想我了解大部分图片,但不是全部。
出于教学考虑,我假设我们在X会话中运行终端仿真器xterm。终端正在运行Bash shell,并且该shell当前正在运行一些长时间运行的管道,该管道由前台的多个进程组成。
我的问题是,到目前为止,我的理解是正确的吗?xterm如何准确地告诉内核将SIGINT发送到具有给定控制终端的会话?
tl; dr内核完成了。
每个pty(伪tty)都有两个端点,一个主节点和一个从属节点。在xterm示例中,xterm将保留在主文件描述符中。任何按键都将直接写入主文件fd中。会话拥有从属fd(pts或pty从属),并传递给任何前台进程组。
每当将ASCII ETX字符(^ C)写入主机时,内核会将其转换为通过相应的控制终端将SIGINT发送到前台进程组。这实际上是一个pty设置。您可以运行stty -a
并看到默认值为intr = ^C;
,即^C
ETX是“ SIGINT”字符。可以将其更改为其他字符或完全禁用。
一个更复杂的示例是Ctrl-C如何通过交互式SSH会话工作。交互式SSH会话在服务器端分配权限。客户端pty设置为原始模式,这意味着客户端内核不会将ETX转换为SIGINT。相反,客户端内核将ETX传递给从属服务器。在这种情况下,ssh客户端进程将使用该ETX并将其传递给服务器sshd进程。如果服务器sshd pty不处于原始模式,则服务器的内核会将ETX转换为SIGINT到其前台进程组。Ctrl-C就是通过这种方式将SIGINT发送到服务器上运行的进程,而不是终止客户端SSH并使您挂起。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句