[Python-Dev] sock.close() not closing?
Sjoerd Mullender
sjoerd at acm.org
Wed May 7 16:37:20 CEST 2008
On 2008-05-07 13:37, Amaury Forgeot d'Arc wrote:
> Hello,
>
> 2008/5/7 Sjoerd Mullender <sjoerd at acm.org>:
>> Why does sock.close() not actually close sock?
>>
>> If I run the code
>>
>> import socket
>> sock = socket.socket()
>> ...
>> sock.close()
>>
>> I would expect that a system call is done to actually close the socket and
>> free the file descriptor. But that does not happen. Look at the code in
>> socket.py. It merely replaces the socket instance with a dummy instance so
>> that all subsequent calls on the sock object fail, but it does nothing else!
>
> It does close the socket:
>
> In socket.py, when self._sock is replaced, its __del__ method will be called.
> This __del__ is implemented in C, in socketmodule.c:
>
> static void
> sock_dealloc(PySocketSockObject *s)
> {
> if (s->sock_fd != -1)
> (void) SOCKETCLOSE(s->sock_fd);
> Py_TYPE(s)->tp_free((PyObject *)s);
> }
>
>
> Of course, if you call sock.dup() or sock.makefile(),
> there is another reference to the underlying _sock, and you must
> close() all these objects.
>
I have to question the design of this. When I close() an object I
expect it to be closed there and then and not at some indeterminate
later time (well, it is determinate when you're fully aware of all
references, but often you aren't--trust me, I understand reference
counting).
Then there also seems to be a bug in imaplib.IMAP4_SSL since in its
shutdown method it closes the socket but leaves the sslobj untouched. I
assume that that object keeps a reference to the socket.
But as I said, I expect the close() to actually close.
--
Sjoerd Mullender
More information about the Python-Dev
mailing list