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

黑猫

详细地说,当您在终端中按Ctrl-C时会发生什么?是的,我知道它发送SIGINT,但是到达那里需要采取什么步骤?

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

出于教学考虑,我假设我们在X会话中运行终端仿真器xterm。终端正在运行Bash shell,并且该shell当前正在运行一些长时间运行的管道,该管道由前台的多个进程组成。

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

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

黑猫

tl; dr内核完成了。

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++标准中,当违反“应”要求时会发生什么?

当线程在C中调用longjmp()时会发生什么

在 C++ 中为对象赋值时会发生什么

当您在python中设置字典时会发生什么?

当我在C ++中存储指向按值传递参数的指针时会发生什么?

基本的c问题-在c中声明静态变量时会发生什么?

当您在JavaScript中分配undefined时会发生什么?

在 C++ 中的 Map 中插入重复值时会发生什么

在C ++中为对象分配引用的值时会发生什么?

在C#中,当您对空对象调用扩展方法时会发生什么?

在c中struct的成员中间调用free时会发生什么?

当我在C ++中对类使用vector时会发生什么

当非void方法在Objective-C中达到终点时会发生什么?

当我在C ++中对未初始化的指针调用“删除”时会发生什么?

当我们在C ++中更改字符串的值时会发生什么

在 C 中,当开始不满足 for 循环的条件时会发生什么?

在svm.scv()中同时使用“ class_weight”和“ c”参数时会发生什么?

当将int列表转换为C中的char列表时会发生什么?

当用C中的空字符截断字符串时会发生什么?

当按位 AND 应用于负数时会发生什么?

在 bash 脚本中,当信号被捕获时会发生什么

从字典中删除值(对象)时会发生什么?

在Unity中设置transform.up时会发生什么

当软件包在源中重复时会发生什么?

在AngularJS中删除ngRepeat使用的对象时会发生什么?

当ArrayList中的元素少于其容量时会发生什么?

在Python中,当您导入函数内部时会发生什么?

当您耗尽Kubernetes集群中的节点时会发生什么?

在lldb中打印Swift对象(po)时会发生什么?