unix - ¿Cuál es la diferencia entre Ctrl-C y SIGINT?
keyboardinterrupt (2)
Como se describe aquí :
Python instala un pequeño número de manejadores de señal de forma predeterminada: SIGPIPE se ignora (por lo que los errores de escritura en las tomas y los enchufes se pueden informar como excepciones ordinarias de Python) y SIGINT se traduce en una excepción KeyboardInterrupt. Todos estos pueden ser anulados.
Entonces, el comportamiento debería ser el mismo entre enviar un SIGINT y un Ctrl + c .
Pero, debes tener cuidado con KeyboardInterrupt
, si en algún lugar de tu código tienes una
try:
...
except: # notice the lack of exception class
pass
esto "comerá" la excepción KeyboardInterrupt.
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 al azar 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 que aparezca el error, así que me pregunto cuál es la diferencia entre las dos acciones.
El programa no capta ninguna acción de teclado, y es solo un programa de Python con algunos subprocesos / procesos en ellos. No instala manejadores de señal (aunque Python lo hace), y stty -a
da intr = ^C
Sospecho que podría ser que Ctrl + C envíe SIGINT
a todos los subprocesos / subprocesos mientras que la kill -INT
solo envía al proceso primario, pero eso es lo que más 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
^C
envía un SIGINT
a todos los procesos en el grupo de procesos en primer plano. Para hacer el equivalente con kill
, debe enviar la señal al grupo de procesos (concepto de nivel de sistema operativo):
kill -SIGINT -<pid>
o al trabajo (concepto de nivel de shell, el proceso finalizó con &
):
kill -SIGINT %