old_contents: import os
  import socket
  import time
  
  
  SERVER_ADDRESS = (HOST, PORT) = '', 8888
  REQUEST_QUEUE_SIZE = 5
  
  
  def handle_request(client_connection):
      request = client_connection.recv(1024)
      print 'Child PID: {pid}. Parent PID: {ppid}'.format(pid=os.getpid(), ppid=os.getppid())
      print request.decode()
      http_response = '''\
  HTTP/1.1 200 OK
  
  Hello World!
  '''
      client_connection.sendall(http_response)
      time.sleep(60)
  
  
  def serve_forever():
      listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
      listen_socket.bind(SERVER_ADDRESS)
      listen_socket.listen(REQUEST_QUEUE_SIZE)
      print 'Serving HTTP on port {port} ...'.format(port=PORT)
      print 'Parent PID (PPID): {pid}\n'.format(pid=os.getpid())
  
      while True:
          client_connection, client_address = listen_socket.accept()
          pid = os.fork()
          if pid == 0:
              listen_socket.close()
              handle_request(client_connection)
              client_connection.close()
              os._exit(0)
          else:
              client_connection.close()
  
  if __name__ == '__main__':
      serve_forever()
  
new_contents: import errno
  import signal
  import os
  import socket
  import time
  
  
  SERVER_ADDRESS = (HOST, PORT) = '', 8888
  REQUEST_QUEUE_SIZE = 5
  
  
  def grim_reaper(signum, frame):
      pid, status = os.wait()
  
  
  def handle_request(client_connection):
      request = client_connection.recv(1024)
      print 'Child PID: {pid}. Parent PID: {ppid}'.format(pid=os.getpid(), ppid=os.getppid())
      print request.decode()
      http_response = '''\
  HTTP/1.1 200 OK
  
  Hello World!
  '''
      client_connection.sendall(http_response)
      time.sleep(3)
  
  
  def serve_forever():
      listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
      listen_socket.bind(SERVER_ADDRESS)
      listen_socket.listen(REQUEST_QUEUE_SIZE)
      print 'Serving HTTP on port {port} ...'.format(port=PORT)
      print 'Parent PID (PPID): {pid}\n'.format(pid=os.getpid())
  
      signal.signal(signal.SIGCHLD, grim_reaper)
  
      while True:
          try:
              client_connection, client_address = listen_socket.accept()
          except IOError as e:
              code, msg = e.args
              if code == errno.EINTR:
                  continue
              else:
                  raise
  
          pid = os.fork()
          if pid == 0:
              listen_socket.close()
              handle_request(client_connection)
              client_connection.close()
              os._exit(0)
          else:
              client_connection.close()
  
  if __name__ == '__main__':
      serve_forever()
  
subject: solve zombie process: use signal handler