mirror of
https://github.com/python/cpython.git
synced 2025-11-03 15:11:34 +00:00
os.kill takes one of two newly added signals, CTRL_C_EVENT and CTRL_BREAK_EVENT, or any integer value. The events are a special case which work with subprocess console applications which implement a special console control handler. Any other value but those two will cause os.kill to use TerminateProcess, outright killing the process. This change adds win_console_handler.py, which is a script to implement SetConsoleCtrlHandler and applicable handler function, using ctypes. subprocess also gets another attribute which is a necessary flag to creationflags in Popen in order to send the CTRL events.
42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""Script used to test os.kill on Windows, for issue #1220212
|
|
|
|
This script is started as a subprocess in test_os and is used to test the
|
|
CTRL_C_EVENT and CTRL_BREAK_EVENT signals, which requires a custom handler
|
|
to be written into the kill target.
|
|
|
|
See http://msdn.microsoft.com/en-us/library/ms685049%28v=VS.85%29.aspx for a
|
|
similar example in C.
|
|
"""
|
|
|
|
from ctypes import wintypes
|
|
import signal
|
|
import ctypes
|
|
|
|
# Function prototype for the handler function. Returns BOOL, takes a DWORD.
|
|
HandlerRoutine = wintypes.WINFUNCTYPE(wintypes.BOOL, wintypes.DWORD)
|
|
|
|
def _ctrl_handler(sig):
|
|
"""Handle a sig event and return 0 to terminate the process"""
|
|
if sig == signal.CTRL_C_EVENT:
|
|
pass
|
|
elif sig == signal.CTRL_BREAK_EVENT:
|
|
pass
|
|
else:
|
|
print("UNKNOWN EVENT")
|
|
return 0
|
|
|
|
ctrl_handler = HandlerRoutine(_ctrl_handler)
|
|
|
|
|
|
SetConsoleCtrlHandler = ctypes.windll.kernel32.SetConsoleCtrlHandler
|
|
SetConsoleCtrlHandler.argtypes = (HandlerRoutine, wintypes.BOOL)
|
|
SetConsoleCtrlHandler.restype = wintypes.BOOL
|
|
|
|
if __name__ == "__main__":
|
|
# Add our console control handling function with value 1
|
|
if not SetConsoleCtrlHandler(ctrl_handler, 1):
|
|
print("Unable to add SetConsoleCtrlHandler")
|
|
exit(-1)
|
|
|
|
# Do nothing but wait for the signal
|
|
input()
|