On Feb 8, 7:04 am, Larry Bates <[EMAIL PROTECTED]> wrote: > [EMAIL PROTECTED] wrote: > > I'm developing a program that runs using an asyncore loop. Right now > > I can adequately terminate it using Control-C, but as things get > > refined I need a better way to stop it. I've developed another > > program that executes it as a child process using popen2.Popen4(). I > > was attempting to use signals to stop it (using os.kill()) but I keep > > running into a problem where sending the signal causes an infinite > > loop of printing the message "warning: unhandled exception". This > > message appears to be coming from asyncore.py. > > > Searching online I've found this old post that describes setting up a > > signal handler using signal.signal(): > > >http://mail.python.org/pipermail/medusa-dev/2000/000571.html > > > I've tried it but I don't see any indication that my handler method is > > being called. My best guess is that something somewhere else is > > overriding my signal handling callbacks and sending the signals > > elsewhere until they make their way into asyncore where they cause the > > error message. > > > Any other ideas on how to get this to work? If there's a different > > signal I can use that other code won't override, that's fine (I don't > > care what the signal is, as long as I can catch it). Or perhaps there > > is something different I can do? The program, at present, doesn't > > have much in the way of an internal shutdown mechanism. > > > I'm using Python 2.5.1 on Fedora 8; the program does not need to be > > portable to Windows. > > > - David > > > (p.s. please post replies on the list; this email address doesn't work > > so I won't see any replies sent directly to me) > > Please share a little of the code you used to "catch" the signal. What > signal(s) are you catching? What kill level are you sending (these have to > match up). I've used this quite successfully in some of my programs. > > -Larry
Sure. First, here is the signal I'm sending, from the parent process: os.kill(self.child.pid, signal.SIGTERM) self.child is the popen2.Popen4 object returned from creating the child process. In the child process, one of the first things in the "main" section (if __name__ == '__main__':) is to set up the signal handler: signal.signal(signal.SIGTERM, handle_shutdown_signal) handle_shutdown_signal looks a lot like Sam Rushing's example code from his 2000 post, though I didn't see much of a reason to have the callback function turn around and call another function, so I combined them: SHUTDOWN_PERFORMED = False def handle_shutdown_signal(signum, frame): global SHUTDOWN_PERFORMED print 'in shutdown handler, caught signal', signum #diagnostic msg if not SHUTDOWN_PERFORMED: #do some stuff asyncore.socket_map.clear() SHUTDOWN_PERFORMED = True raise asyncore.ExitNow I also tried replacing the raise asyncore.ExitNow command with a simple exit() call but that didn't help. I've also tried using SIGHUP and SIGKILL and they didn't seem to make a difference. - David -- http://mail.python.org/mailman/listinfo/python-list