1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | ''' Docstring copied from Python 2.5 to document what should be implemented: """ This module provides mechanisms to use signal handlers in Python. Functions: signal(sig,action) -- set the action for a given signal (done) pause(sig) -- wait until a signal arrives [Unix only] alarm(seconds) -- cause SIGALRM after a specified time [Unix only] getsignal(sig) -- get the signal action for a given signal default_int_handler(action) -- default SIGINT handler (done, but acts string) Constants: SIG_DFL -- used to refer to the system default handler SIG_IGN -- used to ignore the signal NSIG -- number of defined signals SIGINT, SIGTERM, etc. -- signal numbers *** IMPORTANT NOTICE *** A signal handler function is called with two arguments: the first is the signal number, the second is the interrupted stack frame. """ *** According to http://java.sun.com/products/jdk/faq/faq-sun-packages.html 'writing java programs that rely on sun.* is risky: they are not portable, and are not supported.' This module depends on sun.misc.Signal* so this will likely not make it into jython proper. ''' import sun.misc.Signal import sun.misc.SignalHandler import threading import exceptions #import java import traceback from StringIO import StringIO debug = 0 SIGHUP = 1 SIGINT = 2 SIGQUIT = 3 SIGILL = 4 SIGTRAP = 5 SIGABRT = 6 SIGPOLL = 7 SIGFPE = 8 SIGKILL = 9 SIGBUS = 10 SIGSEGV = 11 SIGSYS = 12 SIGPIPE = 13 SIGALRM = 14 SIGTERM = 15 SIGURG = 16 SIGSTOP = 17 SIGTSTP = 18 SIGCONT = 19 SIGCHLD = 20 SIGTTIN = 21 SIGTTOU = 22 SIGXCPU = 24 SIGXFSZ = 25 SIGVTALRM = 26 SIGPROF = 27 SIGWINCH = 28 SIGINFO = 29 SIGUSR1 = 30 SIGUSR2 = 31 SIG_DFL = sun.misc.SignalHandler.SIG_DFL # default system handler SIG_IGN = sun.misc.SignalHandler.SIG_IGN # handler to ignore a signal NSIG = 32 # number of defined signals _signals = { 2: sun.misc.Signal('INT'), 3: sun.misc.Signal('QUIT'), 4: sun.misc.Signal('ILL'), 5: sun.misc.Signal('TRAP'), 6: sun.misc.Signal('ABRT'), 7: sun.misc.Signal('EMT'), 8: sun.misc.Signal('FPE'), 9: sun.misc.Signal('KILL'), 10: sun.misc.Signal('BUS'), 11: sun.misc.Signal('SEGV'), 12: sun.misc.Signal('SYS'), 13: sun.misc.Signal('PIPE'), 14: sun.misc.Signal('ALRM'), 15: sun.misc.Signal('TERM'), 16: sun.misc.Signal('URG'), 17: sun.misc.Signal('STOP'), 18: sun.misc.Signal('TSTP'), 19: sun.misc.Signal('CONT'), 20: sun.misc.Signal('CHLD'), 21: sun.misc.Signal('TTIN'), 22: sun.misc.Signal('TTOU'), 23: sun.misc.Signal('IO'), 24: sun.misc.Signal('XCPU'), 25: sun.misc.Signal('XFSZ'), 26: sun.misc.Signal('VTALRM'), 27: sun.misc.Signal('PROF'), 28: sun.misc.Signal('WINCH'), 29: sun.misc.Signal('INFO'), 30: sun.misc.Signal('USR1'), 31: sun.misc.Signal('USR2') } class JythonSignalHandler(sun.misc.SignalHandler): def __init__(self,signal,action): if debug: print 'JythonSignalHandler initing with action', str(action),'for', signal.getName() self.action = action self.signal = signal self.oldHandler = sun.misc.Signal.handle(self.signal,self) def handle(self, signal): if debug: print 'Diagnostic Signal Handler called for signal:',signal.getName(),':',signal.getNumber() if self.signal==signal: if hasattr(self.action,'class') and self.action.getClass() == sun.misc.NativeSignalHandler: pass #NativeSignal Handlers are called by the JVM not us else: self.action() if self.oldHandler: self.oldHandler.handle(signal) def signal(sig, action): """ signal(sig, action) -> action Set the action for the given signal. The action can be SIG_DFL, SIG_IGN, or a callable Python object. The previous action is returned. See getsignal() for possible return values. *** IMPORTANT NOTICE *** A signal handler function is called with two arguments: the first is the signal number, the second is the interrupted stack frame. """ if debug: print 'signal called with ',sig,action signal = _signals[sig] newHandler = JythonSignalHandler(signal,action) oldHandler = newHandler.oldHandler return oldHandler def default_int_handler(*args): """ default_int_handler(...) The default handler for SIGINT installed by Python. It raises KeyboardInterrupt. """ raise exceptions.KeyboardInterrupt |
Powered by Pylons - Contact Administrators
Comments (0)
You must login before you can comment.