Я отлаживал программу Python, которая дает сбой после получения исключения KeyboardInterrupt
. Обычно это делается нажатием Ctrl + C в оболочке. Чтобы проверить, исправляет ли ошибка конкретное изменение кода, у меня был небольшой сценарий оболочки, который отправлял программе SIGINT
в случайное время после запуска. У меня проблема в том, что отправка Ctrl + C , похоже, оказывает на программу другое влияние, чем отправка сигнала SIGINT
, и, таким образом, не вызывает появление ошибки, поэтому я очень удивлен в чем разница между этими двумя действиями.
Программа вообще не улавливает никаких действий с клавиатуры, а представляет собой просто программу на Python с некоторыми потоками / процессами в них. Он не устанавливает обработчиков сигналов (хотя Python устанавливает), а stty -a
дает intr = ^ C
. Я подозреваю, что, возможно, Ctrl + C отправляет SIGINT
всем подпроцессам / потокам, в то время как kill -INT
отправляет только основному процессу, но это насколько мои подозрения идут.
Вот сценарий оболочки, который отправляет 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