| """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, WINFUNCTYPE | |
| import signal | |
| import ctypes | |
| import mmap | |
| import sys | |
| # Function prototype for the handler function. Returns BOOL, takes a DWORD. | |
| HandlerRoutine = 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) | |
| # Awaken mail process | |
| m = mmap.mmap(-1, 1, sys.argv[1]) | |
| m[0] = '1' | |
| # Do nothing but wait for the signal | |
| while True: | |
| pass |