On Sun, 4 Nov 2018, Chris Hanson wrote:
Every piece of code that wants to call, say, read(2)
needs to handle
not only real errors but also needs to special-case EINTR and retry
the read. Thus you should virtually never use read(2), only ever
something like this:
...
And do this for every classic system call, since virtually no client
code should ever have to care about EINTR. It was early an
implementation expediency that became API and that everyone now has
to just deal with because you can’t expect the system call interface
you use to do this for you.
This is the sort of wart that should’ve been fixed by System V and/or BSD 4 at latest.
But it *was* fixed in BSD, and it's in POSIX as the SA_RESTART flag to
sigaction (which gives you BSD signal semantics).
POSIX supports both the original V7 and BSD signal semantics, because
by then there were programs which expected system calls to be
interrupted by signals (and to be fair, there are times when that's
the more convenient way of handling an interrupt, as opposed to using
setjump/longjump to break out of a restartable system call).
- Ted
P.S. The original implementation of ERESTARTSYS / ERESTARTNOHAND /
ERESTARTNOINTR errno handling in Linux's system call return path was
my fault. :-)