Я новичок в Linux, и я узнаю о системных вызовах и сигналах. Например, системный вызов read
может быть прерван сигналом. Если он прерван до того, как что-либо было прочитано, он сработает и устанавливает errno
в EINTR
. В glibc
это в основном обрабатывается макросом TEMP_FAILURE_RETRY
. Но если он прерывается, когда считываются только некоторые данные, функции преуспевают в чтении меньше, чем было запрошено. В этом случае вызывающий абонент должен выдать еще read
для недостающей части, продолжая это до тех пор, пока все данные не будут прочитаны. Тем не менее, glibc
источник содержит многочисленные вызовы, как это:glibc и системные вызовы, прерванные сигналами
if (TEMP_FAILURE_RETRY (read (fd, &word, 4)) != 4)
error (EXIT_FAILURE, errno, _("cannot read header"));
Это, казалось бы означать, что это, во многих местах, не перезапускается системный вызов правильно. Я что-то упускаю? Для меня казалось бы, что случай прерывания с частичным чтением будет более распространенным, чем сценарий без чтения, и все чаще, так как запрашиваемая сумма будет больше.
Спасибо за ваш ответ. Это проливает свет на вопрос. Я определенно должен исследовать его больше. Исходя из фона разработки Windows, я должен согласиться на поиск * сигнальных/системных вызовов * nix (и взаимодействия между ними). – Steve