| 
									
										
										
										
											2010-04-12 17:16:38 +00:00
										 |  |  | """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. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 14:51:42 +00:00
										 |  |  | from ctypes import wintypes, WINFUNCTYPE | 
					
						
							| 
									
										
										
										
											2010-04-12 17:16:38 +00:00
										 |  |  | import signal | 
					
						
							|  |  |  | import ctypes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Function prototype for the handler function. Returns BOOL, takes a DWORD. | 
					
						
							| 
									
										
										
										
											2010-09-29 14:51:42 +00:00
										 |  |  | HandlerRoutine = WINFUNCTYPE(wintypes.BOOL, wintypes.DWORD) | 
					
						
							| 
									
										
										
										
											2010-04-12 17:16:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							|  |  |  |     while True: | 
					
						
							|  |  |  |         pass |