Error: child process close a socket inherited from parent

narke narkewoody at gmail.com
Sun May 29 04:53:44 EDT 2011


Hi,

As illustrated in the following simple sample:

import sys
import os
import socket

class Server:
    def __init__(self):
        self._listen_sock = None

    def _talk_to_client(self, conn, addr):
        text = 'The brown fox jumps over the lazy dog.\n'
        while True:
            conn.send(text)
            data = conn.recv(1024)
            if not data:
                break
        conn.close()

    def listen(self, port):
        self._listen_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._listen_sock.bind(('', port))
        self._listen_sock.listen(128)
        self._wait_conn()

    def _wait_conn(self):
        while True:
            conn, addr = self._listen_sock.accept()
            if os.fork() == 0:
                self._listen_sock.close()           # line x
                self._talk_to_client(conn, addr)
            else:
                conn.close()

if __name__ == '__main__':
    Server().listen(int(sys.argv[1]))

Unless I comment out the line x, I will get a 'Bad file descriptor'
error when my tcp client program (e.g, telnet) closes the connection to
the server.  But as I understood, a child process can close a unused
socket (file descriptor).

Do you know what's wrong here?


-- 
Life is the only flaw in an otherwise perfect nonexistence
   -- Schopenhauer

narke



More information about the Python-list mailing list