blob: ab2e5e518495559928a6e39ac7c6bb70434bd4a3 [file] [log] [blame]
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import os
import signal
# a dict cache of signal number -> signal name
_SIG_NAME = None
def strsig(n):
"""
Translate a process signal identifier to a human readable string.
"""
global _SIG_NAME
if _SIG_NAME is None:
# cache signal names
_SIG_NAME = {}
for k in dir(signal):
if (k.startswith("SIG")
and not k.startswith("SIG_")
and k != "SIGCLD" and k != "SIGPOLL"):
_SIG_NAME[getattr(signal, k)] = k
# Realtime signals mostly have no names
if hasattr(signal, "SIGRTMIN") and hasattr(signal, "SIGRTMAX"):
for r in range(signal.SIGRTMIN+1, signal.SIGRTMAX+1):
_SIG_NAME[r] = "SIGRTMIN+" + str(r - signal.SIGRTMIN)
if n < 0 or n >= signal.NSIG:
return "out-of-range signal, number %s" % n
try:
return _SIG_NAME[n]
except KeyError:
return "unrecognized signal, number %s" % n
def strstatus(status):
"""
Returns a human readable string of a process exit code, as returned
by the subprocess module.
"""
# 'status' is the exit status
if os.name != 'posix':
# Windows error codes are easier to look up if printed in hexadecimal
if status < 0:
status += 2**32
return "exit %x" % status
elif status >= 0:
return "exit %d" % status
else:
return "killed by %s" % strsig(-status)