Bash
CTRL^C 究竟如何傳遞信號以進行處理
我試圖弄清楚 CTRL^C 如何準確地將 SIGINT 發送到程序。讓我們考慮一個偽終端系統。我會寫下我知道的(或認為我知道的,哈哈),請在需要的地方添加/替換:
球員是:
- Xterm - 這是一個使用者空間程序,它從鍵盤讀取(使用 X 視窗系統)並將圖片呈現到螢幕上。它從鍵盤獲得的每個字元都傳遞給
pty master
.- 使用者程序 - 作為終端的前台作業執行的使用者程序。通常在打開 Xterm 時,它會執行 bash 或其他一些 shell 程序作為這個使用者程序。
- PTY 設備 - 這是一個字元設備,使用者程序連接到它的
stdin
,stdout
,stderr
. 程序寫入的所有stdout
內容都由 TTY 驅動程序及其線路規程處理,並作為輸入傳遞給 maser 端,反之亦然。我現在不介意一旦線路規程/TTY 驅動程序知道它應該向程序發送這樣的信號,核心如何將信號准確地傳遞給程序。我感興趣的是,在我按下
CTRL^Z
鍵盤後,Xterm(讀取此按鍵的程序)如何將此資訊傳遞給pty master
編輯
感謝您的回答。我歡迎你在這個執行緒上做出回應,我實際上試圖通過寫入
0x3
PTY 主機來模擬這一點,看看從機中發生了什麼。你們能回應一下嗎?
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