[Python-Dev] Signal-resistant code (was: Two random and nearly unrelated ideas)
Jack Jansen
Jack.Jansen@oratrix.com
Wed, 4 Sep 2002 13:45:30 -0700
On woensdag, sep 4, 2002, at 11:51 US/Pacific, Oren Tirosh wrote:
> When an I/O operation is interrupted by an unmasked signal it returns
> with errno==EINTR. The state of the file is not affected and repeating
> the operation should recover and continue with no loss of data.
>
I'm not sure about modern unixen (it's been a long time since I was
interested in such lowlevel details) but historically this has been one
complete mess.
Aside from some unix variations that basically didn't do restart at all
there have always been problems with signal restart semantics. For
sockets and various devices (raw ttys, I think) you could definitely
lose data.
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.