[Python-Dev] Signal-resistant code (was: Two random and nearly unrelated ideas)

Oren Tirosh oren-py-d@hishome.net
Thu, 5 Sep 2002 08:27:37 +0300

On Wed, Sep 04, 2002 at 04:48:11PM -0400, Guido van Rossum wrote:
> [Jack]
> > Hmm, and when I think of it I don't think it's even possible to restart 
> > safely. What if I do a read() on a socket, and I request more bytes 
> > than the available physical memory (but less than VM, of course)? The 
> > kernel simply doesn't have anywhere to store the bytes other than my 
> > buffer, and if it has to return EINTR then >POOF< these bytes are gone 
> > forever.
> I think that if any bytes have already been copied into your buffer,
> you don't get an EINTR, you get a short read.

>From read(2) man page:

   EINTR  The call was interrupted by a signal before any data was read.

Same applies to write, recv, fcntl with locks, semop, etc. They're all 
designed to be restartable. The keyword in all cases is "before".