При каких условиях может происходить короткое чтение / запись?

Функции чтения и записи (и родственники например, send , recv , readv , ...) может возвращать количество байтов, меньшее запрошенной длины чтения / записи, если прервано сигналом (ниже при определенных обстоятельствах) и, возможно, в других случаях. Есть ли четко определенный набор условий, когда это может произойти, или это в значительной степени зависит от реализации? Вот некоторые конкретные вопросы, ответы на которые меня интересуют:

  • Если обработчик сигнала не прерывает работу ( SA_RESTART ), это приведет к тому, что операции ввода-вывода будут прерваны до того, как будут переданы какие-либо данные, которые будут перезапущены после возврата обработчика сигнала. Но если частичное чтение / запись уже произошло и обработчик сигнала не прерывает работу, вернется ли системный вызов немедленно с частичной длиной, или он будет возобновлен с попыткой чтения / записи остатка?
  • Очевидно, функции чтения могут возвращать короткие чтения дескрипторов файла сети, канала и терминала, когда доступно меньше данных, чем запрошенное количество. Но могут ли функции записи возвращать короткие записи в этих случаях из-за ограниченного размера буфера, или они будут блокироваться до тех пор, пока не будут записаны все данные?

Меня бы интересовали все три стандарта: требуемые, общие и специфичные для Linux. поведение.

6
задан R.. 26 March 2011 в 13:31
поделиться