Checking if errno != EINTR: what does it mean?
Many system calls will report the EINTR
error code if a signal occurred while the system call was in progress. No error actually occurred, it's just reported that way because the system isn't able to resume the system call automatically. This coding pattern simply retries the system call when this happens, to ignore the interrupt.
For instance, this might happen if the program makes use of alarm()
to run some code asynchronously when a timer runs out. If the timeout occurs while the program is calling write()
, we just want to retry the system call (aka read/write, etc).
the answers here are really good and i want to add some internal details :
System calls that are interrupted by signals can either abort and return
EINTR
or automatically restart themselves if and only ifSA_RESTART
is specified insigaction(2)
and the one responsible for this task is the restart_block
which used to track information and arguments for restarting system calls
From the man page on write
:
The call was interrupted by a signal before any data was written