Index: reloader.py
===================================================================
--- reloader.py	(revision 2356)
+++ reloader.py	(working copy)
@@ -22,21 +22,25 @@
 import time
 import threading
 import atexit
+import signal
 from wsgikit.util.classinstance import classinstancemethod
 
 def install(poll_interval=1, raise_keyboard_interrupt=True):
-    mon = Monitor(poll_interval=poll_interval,
+    mon = Monitor(main_pid=os.getpid(), poll_interval=poll_interval,
                   raise_keyboard_interrupt=raise_keyboard_interrupt)
     t = threading.Thread(target=mon.periodic_reload)
+    t.setDaemon(1)
+    t.setName('reloader')
     t.start()
-    
+
 class Monitor:
 
     instances = []
 
-    def __init__(self, poll_interval, raise_keyboard_interrupt):
+    def __init__(self, main_pid, poll_interval, raise_keyboard_interrupt):
         self.module_mtimes = {}
         atexit.register(self.atexit)
+        self.main_pid = main_pid
         self.keep_running = True
         self.poll_interval = poll_interval
         self.raise_keyboard_interrupt = raise_keyboard_interrupt
@@ -56,7 +60,7 @@
             if not self.keep_running:
                 break
             if not self.check_reload():
-                os._exit(3)
+                os.kill(self.main_pid, signal.SIGHUP)
                 break
             time.sleep(self.poll_interval)
 
Index: server.py
===================================================================
--- server.py	(revision 2356)
+++ server.py	(working copy)
@@ -29,6 +29,7 @@
 
 import sys
 import os
+import signal
 from wsgikit import reloader
 from wsgikit import wsgilib
 
@@ -261,7 +265,7 @@
         new_environ[reloader_environ_key] = 'true'
         exit_code = os.spawnve(os.P_WAIT, sys.executable,
                                args, new_environ)
-        if exit_code != 3:
+        if not exit_code == -signal.SIGHUP:
             return None, exit_code
         print "Exit code 3; restarting server"
 
