В чем разница между Ctrl-C и SIGINT?

Я отлаживал программу 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
27
задан SamB 31 January 2012 в 04:56
поделиться