Системный вызов write() выполняет лишь частичную запись с меныпей вероятностью,
чем системный вызов readO делает частичное считывание. Помимо
этого, для системного вызова w r iteO не существует условия EOF. Что касается
обычных файлов, w r iteO гарантированно выполняет запрошенную операцию
записи полностью, если только не происходит какая-либо ошибка.
Следовательно, для обычных файлов нет необходимости реализовывать запись
в цикле. Однако для других типов файлов, например сокетов, цикл может
потребоваться, чтобы гарантировать, что все запрошенные байты действительно
будут записаны. Еще одно преимущество использования цикла состоит в том,
что второй вызов w r iteO может вернуть ошибку, поясняющую, почему первый
вызов выполнил запись только частично (хотя, повторюсь, такая ситуация
встречается не часто). Вот пример реализации с циклом:
ssize_t ret. nr.
while (len '= 0 && (ret = write (fd. buf. len)) '= 0) {
if (ret == -1) {
if (errno == EINTR)
continue,
perror ("write"),
break.
len -= ret.
buf += ret.
}