Tôi đã gỡ lỗi chương trình Python phân biệt sau khi nhận được ngoại lệ KeyboardInterrupt
. Điều này thường được thực hiện bằng cách nhấn Ctrl + C từ vỏ. Để kiểm tra xem một mã cụ thể có thay đổi được lỗi hay không, tôi đã có một tập lệnh shell nhỏ gửi SIGINT
đến chương trình vào thời điểm ngẫu nhiên sau khi khởi động. Vấn đề tôi gặp phải là gửi Ctrl + C dường như có tác dụng khác với chương trình hơn là gửi tín hiệu SIGINT
và do đó không gây ra lỗi xuất hiện, vì vậy tôi tự hỏi sự khác biệt giữa hai hành động là gì.Sự khác nhau giữa Ctrl-C và SIGINT là gì?
Chương trình không bắt bất kỳ thao tác bàn phím nào cả, và chỉ là chương trình python với một số luồng/quy trình trong đó. Nó cài đặt không có trình xử lý tín hiệu (mặc dù Python làm), và stty -a
cho intr = ^C
. Tôi nghi ngờ rằng có thể là Ctrl + C gửi SIGINT
cho tất cả các quy trình con/luồng trong khi kill -INT
chỉ gửi đến quy trình chính, nhưng đó là điều mà tôi nghi ngờ.
Đây là tập lệnh shell gửi số kill -INT
.
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
Tôi không chắc chắn về sự khác biệt này, nhưng ctrl + c có thể gửi 'SIGTERM' thay vì' SIGINT'. Ngoài ra, khi xử lý các trường hợp ngoại lệ là bạn làm sạch các tiểu trình/chủ đề của bạn một cách chính xác? Cách python xử lý chủ đề Tôi không tin rằng nó sẽ seg-fault, nhưng nó có thể có thể với các tiểu quy trình. – David
có bất kỳ đa luồng nào trong mã không? – Casey