2016-03-03 13 views
1

Я новичок в 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")); 

Это, казалось бы означать, что это, во многих местах, не перезапускается системный вызов правильно. Я что-то упускаю? Для меня казалось бы, что случай прерывания с частичным чтением будет более распространенным, чем сценарий без чтения, и все чаще, так как запрашиваемая сумма будет больше.

ответ

1

Но если он прерван, когда считываются только некоторые данные, функции преуспевают в чтении меньше, чем было запрошено.

Ваше понимание этого предмета является неполным. Вы захотите внимательно прочитать это сообщение man page (раздел «Прерывание системных вызовов и библиотечные функции обработчиками сигналов»).

В частности обратите внимание на различие между «медленными» устройствами и локальным диском (который считается быстрым).

Это, по-видимому, означает, что во многих местах оно не перезапускает системный вызов должным образом.

Если чтение было от «быстрого» устройства и SA_RESTART был использован, то системный вызов будет перезапущен автоматически, и нет частичного читает возможно.

+0

Спасибо за ваш ответ. Это проливает свет на вопрос. Я определенно должен исследовать его больше. Исходя из фона разработки Windows, я должен согласиться на поиск * сигнальных/системных вызовов * nix (и взаимодействия между ними). – Steve

Смежные вопросы