我一直在調試一個Python程序,它在收到KeyboardInterrupt
異常後發生段錯誤。這通常通過從shell中按下Ctrl + C來完成。爲了測試一個特定的代碼修改是否修復了這個bug,我有一個小的shell腳本,它在啓動後隨機發送SIGINT
到程序中。我遇到的問題是,發送Ctrl + C似乎對程序的影響不同於發送信號SIGINT
並且因此不會導致錯誤出現,所以我很好奇這兩個操作之間的區別是什麼。Ctrl-C和SIGINT有什麼區別?
該程序根本沒有捕獲到任何鍵盤動作,而只是一個包含一些線程/進程的Python程序。它沒有安裝信號處理程序(雖然Python),stty -a
給出intr = ^C
。我懷疑它可能是Ctrl + C發送SIGINT
到所有的子進程/線程,而kill -INT
只發送到主進程,但這是我的懷疑。
這裏是發送kill -INT
的shell腳本。
wait
while :; do
seconds="$(python -c 'import random; print random.random()*4')"
./mandos --debug --configdir=confdir \
--statedir=statedir --no-restore --no-dbus &
pid=$!
{ sleep $seconds; kill -INT $pid; } &
fg %./mandos
status=$?
if [ $status -gt 1 ]; then
echo "Failed exit $status after $seconds seconds"
break
fi
wait
done
我不確定這會有多大的差異,但它可能ctrl + c發送'SIGTERM'而不是'SIGINT'。另外,處理異常時,你是否正確清理子流程/線程? python處理線程的方式我不相信它會出現seg-fault,但是它可能有子進程。 – David
代碼中是否有多線程? – Casey