Системные вызовы могут быть прерваны любым сигналом , включая такие сигналы, как SIGINT (генерируемый CTRL-C), SIGHUP и т. Д.
Когда установлено SA_RESTART
, asend()
вернет (с количеством отправленных сообщений), если какие-либо данные были переданы до получения сигнала, вернет ошибку EINTR
, если установлен тайм-аут отправки (так как они не могут быть перезапущены), в противном случае send()
будет перезапущен.
Перезапуск системного вызова реализован в коде обработки сигналов ядра.Системный вызов внутренне возвращает -ERESTARTSYS
при обнаружении ожидающего сигнала (или при ожидании, прерванном сигналом), что заставляет код обработки сигнала восстановить указатель команды и соответствующие регистры до состояния перед вызовом, делая повторный системный вызов.