Bash

CTRL^C 究竟如何傳遞信號以進行處理

  • January 19, 2021

我試圖弄清楚 CTRL^C 如何準確地將 SIGINT 發送到程序。讓我們考慮一個偽終端系統。我會寫下我知道的(或認為我知道的,哈哈),請在需要的地方添加/替換:

球員是:

  • Xterm - 這是一個使用者空間程序,它從鍵盤讀取(使用 X 視窗系統)並將圖片呈現到螢幕上。它從鍵盤獲得的每個字元都傳遞給pty master.
  • 使用者程序 - 作為終端的前台作業執行的使用者程序。通常在打開 Xterm 時,它會執行 bash 或其他一些 shell 程序作為這個使用者程序。
  • PTY 設備 - 這是一個字元設備,使用者程序連接到它的stdin, stdout, stderr. 程序寫入的所有stdout內容都由 TTY 驅動程序及其線路規程處理,並作為輸入傳遞給 maser 端,反之亦然。

我現在不介意一旦線路規程/TTY 驅動程序知道它應該向程序發送這樣的信號,核心如何將信號准確地傳遞給程序。我感興趣的是,在我按下CTRL^Z鍵盤後,Xterm(讀取此按鍵的程序)如何將此資訊傳遞給pty master

編輯

感謝您的回答。我歡迎你在這個執行緒上做出回應,我實際上試圖通過寫入0x3PTY 主機來模擬這一點,看看從機中發生了什麼。你們能回應一下嗎?

xterm只需將^C字元(ASCII 3)寫入偽 tty 主機,您可以輕鬆地模擬script(另一個程序,就像xterm,正在管理主機偽 tty):

{ sleep 1; printf '\x03'; } | script -qc 'trap "echo SIGINT ma tuer; exit 1" I
NT; cat' /dev/null
^CSIGINT ma tuer

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