Hi, thanks for your answer. Should I just use that object's close() method? Is it safe to assume that objects that have fileno() also have close()? (Statically typed interfaces would come in handy now.)
I'm writing a simple asynchronous I/O framework (for learning purposes - I'm aware of the myriad such frameworks for Python), and I'm writing a wrapper around objects that can be passed into select.select(). Since select() requires objects that have fileno's, that's the only requirement I place on the wrapped object's interface, and thus why I've been using FD-based operations: class handle( object ): '''handle( underlying_file ) -> handle object A wrapper for a nonblocking file descriptor/handle. Wraps any object with a fileno() method.''' __slots__ = [ '_real' ] # _real is the underlying file handle. Must support fileno(). def __init__( self, real_handle ): self._real = real_handle def fileno( self ): return self._real.fileno() def close( self ): close( self._real.fileno() ) # seems that this must now become: self._real.close() def wait_readable( self ): ... "js " <[EMAIL PROTECTED]> wrote in news:[EMAIL PROTECTED]: > Hello, Yang. > > You're not supposed to use os.open there. > See the doc at http://docs.python.org/lib/os-fd-ops.html > > Is there any reason you want to use os.close? > > On 20 May 2007 04:26:12 GMT, Yang > <[EMAIL PROTECTED]> wrote: >> Hi, I'm experiencing a problem when trying to close the file descriptor >> for a socket, creating another socket, and then closing the file >> descriptor for that second socket. I can't tell if my issue is about >> Python or POSIX. >> >> In the following, the first time through, everything works. On the >> second connection, though, the same file descriptor as the first >> connection may be re-used, but for some reason, trying to do >> os.read/close on that file descriptor will cause an error. >> >> Thanks in advance for any help on why this problem is occurring and/or >> how to resolve it (preferrably, I can continue to use file descriptors >> instead of resorting to socket.recv/socket.close). >> >> def handle( s ): >> print id(s), s >> print os.read( s.fileno(), 4096 ) # s.recv(4096) >> os.close( s.fileno() ) # s.close() >> svr = socket.socket() >> svr.bind( ( 'localhost', 8003 ) ) >> svr.listen( 1 ) >> while True: >> print 'accepting' >> s,_ = svr.accept() >> handle( s ) >> >> # Traceback (most recent call last): >> # File "./normal_server_close_error.py", line 25, in <module> >> # handle( s ) >> # File "./normal_server_close_error.py", line 13, in handle >> # print os.read( s.fileno(), 4096 ) # s.recv(4096) >> # OSError: [Errno 9] Bad file descriptor >> -- >> http://mail.python.org/mailman/listinfo/python-list >> > -- http://mail.python.org/mailman/listinfo/python-list