Linux

我的程序被殺死但我無法理解核心通知

  • March 20, 2019

我有一個在嵌入式 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

現在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.sysinitor文件。rc.local

**更新:**我已設法將此事件鎖定到我的主機關閉的時間點。我的主機和目標設備之間有一條串列電纜,用於將串列數據發送到嵌入式目標。當我讓目標保持執行但關閉主機時,我的應用程序如上所述被終止。當我在關閉主機之前斷開串列電纜時,我的應用程序不會被殺死並正常執行。即使在我執行之後也會發生這種行為

echo 0 > /proc/sys/kernel/sysrq

按照建議。

在這種情況下,SAK 真正意味著Secure Attention Key。您看到的消息是在drivers/tty/tty_io.c中定義的核心消息。SAK 是確保使用者在控制台上安全登錄的組合鍵。在 Linux SAK 上,通過終止所有附加到呼叫 SAK 的終端的程序來確保這一點。預計隨後init將重新啟動受信任的登錄過程,例如帶有顯示管理器X 伺服器gettylogin

列出的 PID 確實CX_SC3是被 SAK 殺死的應用程序執行緒的 PID。

fd#n opened to the tty意味著被殺死的程序/執行緒將文件描述符*n*打開到呼叫 SAK 的終端。

在 Linux 中有兩種呼叫 SAK的方法:

  1. 通過神奇的 SysRq鍵 - 通常是Alt+ SysRq+ K(虛擬終端)或Break``K(串列控制台)。這不是您的情況,因為您已經嘗試禁用魔法並且意外發送序列是不可能的SysRqecho 0 > /proc/sys/kernel/sysrq``Break``K
  2. 通過定義的按鍵序列(虛擬終端)或中斷信號(串列控制台)。串列控制台上的 SAK 可用性由setserial.

串列線路上的中斷信號是在比字元發送時間長的時間內連續發送間隔值(包括開始、停止和奇偶校驗位)。在您的情況下,很有可能在關閉主機期間出現 Break 信號的情況。請嘗試通過以下方式關閉目標設備串列埠上的 SAK setserial

setserial /dev/ttyS0 ^sak

您可以通過 來檢查串列埠上的 SAK 功能狀態setserial -g /dev/ttyS0。打開SAK後會顯示Flags:。對於啟動後選項的自動設置,請參見 BusyBox 系統上通常的啟動腳本/etc/init.d/rcS/etc/rc.d/S*/或檢查/etc/inittab其他可能性。

引用自:https://unix.stackexchange.com/questions/80857