Когда и как прерываются системные вызовы? - PullRequest
16 голосов
/ 08 ноября 2011

Это дополнительный вопрос к Является ли успешный метод send () "атомарным"? , поскольку я думаю, что в действительности это касается системных вызовов, а не просто отправки по сокетам.системные вызовы могут быть прерваны, и когда они выполняются, где обрабатывается прерывание?Я узнал о SA_RESTART, но не совсем понимаю, что происходит.

  • Если я сделаю системный вызов без SA_RESTART, может ли вызов быть прерван каким-либо прерыванием (например, пользовательский ввод), которые не относятся к моему приложению, но требуют, чтобы ОС прервала мой вызов и сделала что-то еще?Или это прерывается только сигналами, которые непосредственно касаются моего процесса (CTRL + C, сокет закрыт, ...)?

  • При настройке SA_RESTART, какова семантика отправки ()или любой другой "медленный" системный вызов?Будет ли он всегда блокироваться до тех пор, пока все мои данные не будут переданы или сокет не выйдет из строя, или он может вернуться с числом, меньшим, чем число в параметре send ()?перезапуск реализован?Знает ли ОС, что я хочу, чтобы вызов был перезапущен после каких-либо прерываний, или какой-то сигнал отправляется в мой процесс, а затем обрабатывается библиотечным кодом?Или я должен сделать это сам, например, завернуть вызов в цикл while и повторить попытку так часто, как это необходимо?

1 Ответ

11 голосов
/ 08 ноября 2011

Системные вызовы могут быть прерваны любым сигналом , включая такие сигналы, как SIGINT (генерируемый CTRL-C), SIGHUP и т. Д.

Когда установлено SA_RESTART, asend() вернет (с количеством отправленных сообщений), если какие-либо данные были переданы до получения сигнала, вернет ошибку EINTR, если установлен тайм-аут отправки (так как они не могут быть перезапущены), в противном случае send() будет перезапущен.

Перезапуск системного вызова реализован в коде обработки сигналов ядра.Системный вызов внутренне возвращает -ERESTARTSYS при обнаружении ожидающего сигнала (или при ожидании, прерванном сигналом), что заставляет код обработки сигнала восстановить указатель команды и соответствующие регистры до состояния перед вызовом, делая повторный системный вызов.

...