[Python-Dev] About SSL tests
Trent Mick
trentm at activestate.com
Wed Apr 4 00:31:22 CEST 2007
Christian Heimes wrote:
>> I'd be willing to look at adding it, if the group thinks it's the right
>> thing to do.
>
> I like the idea and I'm proposing to add two more methods to subprocess
> Popen.
>
> class Popen(...):
> ...
> def signal(self, signal):
> """Send a signal to the process (UNIX only)
>
> signal is constant from the signal module
> """
>
> def terminate(self, force=False):
> """Terminate the process
>
> On UNIX terminate(False) is equivalent to signal(SIGTERM) and
> terminate(True) to signal(SIGKILL).
>
> On Windows ... (does Windows support a forced terminate?)
> """
Here is what my process.py [1] does for termination (not suggesting you
follow the API here, just showing how it handles termination on
Windows). Some of the Windows logic is borrowed from PyWin32's
winprocess.py [2]
> def kill(self, exitCode=0, gracePeriod=1.0, sig=None):
> """Kill process.
>
> "exitCode" [deprecated, not supported] (Windows only) is the
> code the terminated process should exit with.
> "gracePeriod" (Windows only) is a number of seconds the process is
> allowed to shutdown with a WM_CLOSE signal before a hard
> terminate is called.
> "sig" (Unix only) is the signal to use to kill the process. Defaults
> to signal.SIGKILL. See os.kill() for more information.
>
> Windows:
> Try for an orderly shutdown via WM_CLOSE. If still running
> after gracePeriod (1 sec. default), terminate.
> """
> if sys.platform.startswith("win"):
> import win32gui
> # Send WM_CLOSE to windows in this process group.
> win32gui.EnumWindows(self._close_, 0)
>
> # Send Ctrl-Break signal to all processes attached to this
> # console. This is supposed to trigger shutdown handlers in
> # each of the processes.
> try:
> win32api.GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,
> self._processId)
> except AttributeError:
> log.warn("The win32api module does not have "\
> "GenerateConsoleCtrlEvent(). This may mean that "\
> "parts of this process group have NOT been killed.")
> except win32api.error, ex:
> if ex.args[0] not in (6, 87):
> # Ignore the following:
> # api_error: (87, 'GenerateConsoleCtrlEvent', 'The parameter is incorrect.')
> # api_error: (6, 'GenerateConsoleCtrlEvent', 'The handle is invalid.')
> # Get error 6 if there is no console.
> raise
>
> # Last resort: call TerminateProcess if it has not yet.
> retval = 0
> try:
> self.wait(gracePeriod)
> except ProcessError, ex:
> log.info("[%s] Process.kill: calling TerminateProcess", id(self))
> win32process.TerminateProcess(self._hProcess, -1)
> win32api.Sleep(100) # wait for resources to be released
>
> else:
> if sig is None:
> sig = signal.SIGKILL
> try:
> os.kill(self._pid, sig)
> except OSError, ex:
> if ex.errno != 3:
> # Ignore: OSError: [Errno 3] No such process
> raise
Links:
[1] http://trentm.com/projects/process/
[2]
http://pywin32.cvs.sourceforge.net/pywin32/pywin32/win32/Demos/winprocess.py?revision=1.2&view=markup#l_121
--
Trent Mick
trentm at activestate.com
More information about the Python-Dev
mailing list