36 lines
1020 B
Python
36 lines
1020 B
Python
"""
|
|
import ctypes
|
|
def ctype_async_raise(thread, exception):
|
|
tid=thread.ident
|
|
print (1)
|
|
ret = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), ctypes.py_object(exception))
|
|
# ref: http://docs.python.org/c-api/init.html#PyThreadState_SetAsyncExc
|
|
print (2)
|
|
if ret == 0:
|
|
raise ValueError("Invalid thread ID")
|
|
elif ret > 1:
|
|
# Huh? Why would we notify more than one threads?
|
|
# Because we punch a hole into C level interpreter.
|
|
# So it is better to clean up the mess.
|
|
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, NULL)
|
|
raise SystemError("PyThreadState_SetAsyncExc failed")
|
|
|
|
"""
|
|
import signal
|
|
|
|
def on_abort(parent_thread):
|
|
print ("abort")
|
|
#ctype_async_raise(parent_thread, KeyboardInterrupt)
|
|
signal.raise_signal(signal.SIGINT)
|
|
|
|
|
|
|
|
def handler(signum, frame):
|
|
print('Signal handler called with signal', signum)
|
|
|
|
|
|
# Set the signal handler and a 5-second alarm
|
|
signal.signal(signal.SIGINT, handler)
|
|
|
|
|
|
time.sleep(10.0) |