exitpoller.py
41 lines
| 1.2 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2754 | import os | |
import time | |||
from threading import Thread | |||
class ExitPollerUnix(Thread): | |||
""" A Unix-specific daemon thread that terminates the program immediately | |||
when the parent process no longer exists. | |||
""" | |||
def __init__(self): | |||
super(ExitPollerUnix, self).__init__() | |||
self.daemon = True | |||
def run(self): | |||
# We cannot use os.waitpid because it works only for child processes. | |||
from errno import EINTR | |||
while True: | |||
try: | |||
if os.getppid() == 1: | |||
os._exit(1) | |||
time.sleep(1.0) | |||
except OSError, e: | |||
if e.errno == EINTR: | |||
continue | |||
raise | |||
class ExitPollerWindows(Thread): | |||
""" A Windows-specific daemon thread that terminates the program immediately | |||
when a Win32 handle is signaled. | |||
""" | |||
def __init__(self, handle): | |||
super(ExitPollerWindows, self).__init__() | |||
self.daemon = True | |||
self.handle = handle | |||
def run(self): | |||
from _subprocess import WaitForSingleObject, WAIT_OBJECT_0, INFINITE | |||
result = WaitForSingleObject(self.handle, INFINITE) | |||
if result == WAIT_OBJECT_0: | |||
os._exit(1) |