Ctrl C 不能中止程式問題

2021-06-21 02:55:02 字數 1608 閱讀 6839

email:[email protected]

blog:

最近應用組兄弟反應他們的環境(maemo)下 ctrl-c 不能終止程式,跟蹤了一下,發現maemo 雖然也使用了 busybox, 但是 init 卻是用的 sysvinit 包裡面的。 試著更換成 busybox 的init, ctrlc 是可以終止程式的(比如 sleep 10)。 用 trap及stty 搞了一下, 也沒有成功。

寫乙個測試程式, 收到訊號時會列印資訊:

#include

#include  

show_progress(unsigned long total, unsigned long cur)

void sig_handle(int  sig) 

}  

int main(void)

printf("/n");

return 0;}

核心跟蹤發現串列埠 下按 ctrl-c 不會呼叫n_tty_receive_break,而是呼叫n_tty_receive_char, 在該函式中發出 int2: 跟蹤發現 int 2 訊號總是被發出的,奇怪的是後來沒有被傳送到當前程序(測試程式沒有列印出 hello)

繼續分析, 發現在系統啟動時, 會列印乙個錯誤資訊:

/bin/sh: can't access tty; job control turned off

跟蹤了 busybox, 發現函式tcgetpgrp 呼叫出錯。

google 一下, 似乎此類問題與inittab 有關, 檢查 /etc/inittab, 有一行:

s2:2345:respawn:/bin/sh

這個跟我們system fs 中 busybox init 使用的 /etc/inittab類似:

ttys2::respawn:-/bin/sh

試著將 maemo fs 中的 /etc/inittab respawn 一行替換成上行, 系統不能啟動。 可見此 init 非彼 init啊。

繼續 google, 使用關鍵字 sysvinit, 加上前面的錯誤資訊, 發現人家都是使用 getty.於是修改inittab respawn 一行如下:

t0:2345:respawn:/sbin/getty-l ttys2 115200 vt100

此時登入時需要帳號,密碼, 但是ctrl-c 可以正常工作。

開始研究 getty 自動登入, 從:

得到答案:

修改inittab respawn 一行

t0:2345:respawn:

/sbin/getty -n -l /bin/autologin 115200 ttys2 vt100

並建立可執行檔案:/bin/autologin

#!/bin/sh

/bin/login -froot

發現可以自動登入並且 ctrl-c 可以正常工作。

後記:在linuxforum上進行了提問,下午發現網友 nxin 也給了正確答案:

關鍵點是要有乙個地方呼叫setsid()

,加個getty

就可以了,不過為什麼不用busybox

的init

呢?

可見有問題要多問啊:p

golang捕獲ctrl c退出程式

在golang當中如何捕獲ctrl c命令,讓程式有序的的退出?首先測試一段golang 捕獲sigint和sigkill c make chan os.signal,1 signal.notify c,os.interrupt,os.kill s c fmt.println got signal ...

js模擬ctrl c的問題

1.這種方式只可以對顯示的textbox和textarea使用,對於display none和visibility hidden 以及其他標籤無效 var message document.getelementbyid compcode240 message.select 選擇物件 document...

ctrl c退出python多執行緒程式

多工並行處理多數需要用到多執行緒,第一次用python寫乙個任務,需要同時監控兩個狀態,就使用了下多執行緒,但測試時候ctrl c居然退不出,我以為是bug,結果看了下確實是這樣的。如果乙個python程式用了多執行緒,當子執行緒沒有結束時,用ctrl c是關閉不了主線程的,這時候就只能用kill命...