Author aronacher
Recipients aronacher
Date 2010-09-16.02:02:50
SpamBayes Score 1.11022e-16
Marked as misclassified No
Message-id <1284602578.74.0.189576970404.issue9867@psf.upfronthosting.co.za>
In-reply-to
Content
Currently Python does not check fread and other IO calls for EINTR.  This usually is not an issue, but on OS X a continued program will be sent an SIGCONT signal which causes fread to be interrupted.

Testcase:

mitsuhiko@nausicaa:~$ python2.7
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from signal import SIGCONT, signal
>>> def show_signal(*args):
...  print 'Got SIGCONT'
...  
>>> signal(SIGCONT, show_signal)
0
>>> import sys
>>> sys.stdin.read()
^Z
[1]+  Stopped                 python2.7
mitsuhiko@nausicaa:~$ fg
python2.7
Got SIGCONT
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 4] Interrupted system call
>>> 

Expected behavior: on fg it should continue to read.  The solution would be to loop all calls to fread and friends until errno is no longer EINTR.  Now the question is how to best do that.  I can't think of a portable way to define a macro that continues to run an expression until errno is EINTR, maybe someone else has an idea.

Otherwise it would be possible to just put the loops by hand around each fread/fgetc etc. call, but that would make the code quite a bit more ugly.

Technically I suppose the problem applies to all platforms, on OS X it's just easier to trigger.
History
Date User Action Args
2010-09-16 02:02:58aronachersetrecipients: + aronacher
2010-09-16 02:02:58aronachersetmessageid: <1284602578.74.0.189576970404.issue9867@psf.upfronthosting.co.za>
2010-09-16 02:02:52aronacherlinkissue9867 messages
2010-09-16 02:02:50aronachercreate