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命...