Когда и как прерываются системные вызовы?

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

Какие системные вызовы можно прерывать, и когда они прерываются, где обрабатывается прерывание? Я узнал о SA_RESTART, но не совсем понимаю, что происходит.

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

  • Какова семантика send () или любого другого «медленного» системного вызова при установке SA_RESTART? Будет ли он всегда блокироваться до тех пор, пока все мои данные не будут переданы или сокет не выйдет из строя, или он может вернуться с числом, меньшим, чем счетчик в параметре send ()?

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

16
задан Community 23 May 2017 в 12:10
поделиться