我的进程被杀死了,但我无法理解内核通知

mat*_*975 6 linux kill kernel tty serial-port

我有一个在嵌入式 x86 设置上运行的自定义应用程序(使用 buildroot 和 uClibc 构建)。该应用程序一直运行良好,但今天早上当我返回工作时,我发现我的进程已被终止,并且我的终端上出现以下输出

SAK: killed process 1008 (CX_SC3): fd#4 opened to the tty
SAK: killed process 1009 (CX_SC3): fd#4 opened to the tty
SAK: killed process 1011 (CX_SC3): fd#4 opened to the tty
SAK: killed process 1012 (CX_SC3): fd#4 opened to the tty
Run Code Online (Sandbox Code Playgroud)

现在CX_SC3是我的进程 - 它有多个线程,其中一个打开/dev/ttyS0以通过无线电调制解调器发送消息。串口的 fd 编号为 4。我不明白的是

  1. SAK 的含义
  2. 上面列出的 PID 必须指的是一个被我的应用程序杀死的进程,因为我的应用程序一次只运行一个实例。这些 PID 是否可能实际上是我的线程 ID(因为我的应用程序始终运行 4 个线程)。
  3. 如果我的应用程序杀死了其他进程,为什么我的应用程序也被杀死了?
  4. 什么是opened to the tty部分是什么意思?根据一些研究,这表明这与发送到我用来启动程序的 tty 的中断字符有关。

哪些事件可能导致以下输出?我的嵌入式设置非常小,使用busybox和运行vsftpd除了我的自定义应用程序之外几乎没有其他东西。我的应用程序的健壮性至关重要。

编辑:为了回应下面的评论,如果这是由于检测到 SAK,有什么可以意外触发的吗?是否有可能在串行端口上读取的任何内容触发了这个?另外,我怎样才能为我的系统找到 SAK 组合 -我的根文件系统中的任何地方都没有rc.sysinitorrc.local文件。

更新:我已设法将此事件锁定到我的主机关闭的时间点。我的主机和目标设备之间有一条串行电缆,用于将串行数据发送到嵌入式目标。当我让目标保持运行但关闭主机时,我的应用程序如上所述被终止。当我在关闭主机之前断开串行电缆时,我的应用程序不会被终止并正常运行。这种行为即使在我执行后也会发生

echo 0 > /proc/sys/kernel/sysrq
Run Code Online (Sandbox Code Playgroud)

按照建议。

pab*_*ouk 8

在这种情况下,SAK 真正意味着Secure Attention Key。您看到的消息是在drivers/tty/tty_io.c 中定义的内核消息。SAK 是一个组合键,可确保用户在控制台上安全登录。在 Linux 上,SAK 通过终止连接到终端 SAK 的所有进程来确保这一点。预计init随后将重新启动受信任的登录过程,如getty后跟loginX 服务器显示管理器

列出的 PID 确实CX_SC3是被 SAK 杀死的应用程序线程的 PID 。

fd#n opened to the tty意味着被杀死的进程/线程将文件描述符n打开到调用 SAK 的终端。

在 Linux 中有两种调用 SAK 的方法

  1. 通过神奇的 SysRq键 - 通常是Alt+ SysRq+ K(虚拟终端)或BreakK(串行控制台)。这不是你的情况,你已经尝试过禁用魔术SysRq通过echo 0 > /proc/sys/kernel/sysrq和发送BreakK由事故序列是不可能的。

  2. 通过定义的按键序列(虚拟终端)或中断信号(串行控制台)。串行控制台上的 SAK 可用性由 控制setserial

串行线路上的中断信号是在比字符发送时间(包括开始、停止和奇偶校验位)更长的时间内连续发送间隔值。在您的情况下,很可能在关闭主机期间出现 Break 信号的情况。请尝试通过以下方式关闭目标设备串行端口上的 SAK setserial

setserial /dev/ttyS0 ^sak
Run Code Online (Sandbox Code Playgroud)

您可以通过 来检查串行端口上的 SAK 功能状态setserial -g /dev/ttyS0。开启SAK后会显示Flags:。有关启动后选项的自动设置,请参阅 BusyBox 系统上通常使用的启动脚本/etc/init.d/rcS和//etc/rc.d/S*或检查/etc/inittab其他可能性。