Signal SIGINT ignored during socket.accept

James Harris james.harris.1 at gmail.com
Thu Sep 10 15:11:12 EDT 2015


"Chris Angelico" <rosuav at gmail.com> wrote in message 
news:mailman.332.1441910212.8327.python-list at python.org...
> On Fri, Sep 11, 2015 at 4:24 AM, James Harris 
> <james.harris.1 at gmail.com> wrote:

>> I have a listening socket, self.lsock, which is used in an accept() 
>> call as
>> follows
>>
>>  endpoint = self.lsock.accept()
>>
>> The problem is that if control-C is pressed it is not recognised 
>> until
>> something connects to that socket. Only when the accept() call 
>> returns is
>> the signal seen.
>>
>> The question, then, is how to get the signal to break out of the 
>> accept()
>> call. This is currently on Windows but I would like it to run on Unix 
>> too. I
>> see from the web that this type of thing is a common problem with the
>> underlying C libraries but I cannot quite relate the posts I have 
>> found to
>> Python.
>
> What version of Python are you using? Also (in case it matters), what
> version of Windows?

Good point. It turns out that it does matter. I have one implementation 
which fails (Windows) and one which works (Linux). The Linux one breaks 
out on Control-C. The Windows one does not recognise Control-C until the 
accept() call returns.

The implementations are:

$ uname -srm
Linux 3.18.7-v7+ armv7l
$ python -V
Python 2.7.3

And

c:\>ver
Microsoft Windows XP [Version 5.1.2600]
c:\>python -V
Python 2.7.9

> Have you tested on any Unix system? I just tried on my Linux, and
> Ctrl-C interrupted the accept() straight away,

Thanks.

> so this is quite probably a Windows-only issue.

That turns out to be exactly right.

> Can you produce an absolute minimal demo program? I'd try something 
> like this:
>
> import socket
> s = socket.socket()
> s.listen(1)
> s.accept()

Yes:

port = 8880
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", port))
s.listen(1)
endpoint = s.accept()

> which is what worked for me (interactively, Python 2.7.9 and 3.6.0a0,
> Debian Linux).

On Linux I get

$ python socktest.py
^CTraceback (most recent call last):
  File "socktest.py", line 6, in <module>
    endpoint = s.accept()
  File "/usr/lib/python2.7/socket.py", line 202, in accept
    sock, addr = self._sock.accept()
KeyboardInterrupt
$

On Windows I get

S:\>python socktest.py
Traceback (most recent call last):
  File "socktest.py", line 6, in <module>
    endpoint = s.accept()
  File "C:\Python27\lib\socket.py", line 202, in accept
    sock, addr = self._sock.accept()
KeyboardInterrupt

S:\>

However, on Windows the recognition of Control-C does not happen until 
after something connects to the socket.

I will carry on researching it but maybe the above gives a clue to those 
in the know...!

James




More information about the Python-list mailing list