He estado depurando un programa de Python que segfaults después de recibir una excepción KeyboardInterrupt
. Esto normalmente se hace presionando Ctrl + C desde el shell. Para probar si un cambio de código en particular solucionó el error, tuve un pequeño script de shell que envió SIGINT
al programa en un momento aleatorio después de la puesta en marcha. El problema que tengo es que enviar Ctrl + C parece tener un efecto diferente en el programa que enviar la señal SIGINT
y por lo tanto no está causando la aparición del error, así que me pregunto cuál es la diferencia entre las dos acciones.¿Cuál es la diferencia entre Ctrl-C y SIGINT?
El programa no capta ninguna acción de teclado, y es solo un programa de Python con algunos subprocesos/procesos en ellos. No instala controladores de señal (aunque Python sí), y stty -a
da intr = ^C
. Sospecho que podría ser que Ctrl + C envíe SIGINT
a todos los subprocesos/subprocesos, mientras que kill -INT
solo envía al proceso primario, pero eso es lo que yo sospecho.
Aquí está el script de shell que envía el 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
No estoy seguro de la diferencia que esto sería, pero es posible que ctrl + c esté enviando 'SIGTERM' en lugar de' SIGINT'. Además, al manejar la excepción, ¿está limpiando correctamente sus subprocesos/subprocesos? La forma en que python maneja los hilos no creo que seg-fault, pero probablemente sea posible con subprocesos. – David
¿hay algún multihilo en el código? – Casey