write
записывает до
count
байтов из буфера
buf
в файл, на который ссылается файловый описатель
fd.
POSIX указывает на то, что вызов write(), произошедший после вызова
read() возвращает уже новое значение. Заметьте, что не все
файловые системы соответствуют стандарту POSIX.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
В случае успешного завершения возвращается количество байтов, которые были записаны
(ноль означает, что не было записано ни одного байта). В случае
ошибки возвращается -1, а переменной errno присваивается соответствующее
значение. Если count равен нулю, а файловый описатель ссылается
на обычный файл, то будет возвращен ноль и больше не будет
произведено никаких действий. Для специальных файлов результаты
не могут быть перенесены на другую платформу.
НАЙДЕННЫЕ ОШИБКИ
EBADF
fd
не является правильным файловым описателем или же не открыт для
записи.
EINVAL
fd
связан с объектом, не подлежащим записи.
EFAULT
buf
указывает за пределы доступного адресного пространства.
EFBIG
Была выполнена попытка записи файла, размер которого превышает максимально
определенный системой или процессом лимит, или была попытка
записать в файле данные в позицию за пределами максимального допустимого смещения.
EPIPE
fd
соединен с каналом (pipe) или сокетом, но принимающее соединение разорвано. Когда
это происходит, записывающий процесс получает сигнал
SIGPIPE.
(Таким образом, возвращаемое write значение видно, только если
программа ловит, блокирует или игнорирует этот сигнал).
EAGAIN
С помощью флага
O_NONBLOCK
был запрошен неблокированый ввод-вывод, а запись была в блокирующем режиме.
EINTR
Системный вызов был прерван сигналом до того, как был записан хотя бы
один байт данных.
ENOSPC
На устройстве, содержащем файл, описываемый
fd,
нет места для записи данных.
EIO
При модификации inode произошла низкоуровневая ошибка ввода-вывода.
Могут произойти не описанные выше ошибки в зависимости от объекта,
связанного с
fd.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID, POSIX, X/OPEN, 4.3BSD. SVr4 описывают дополнительные
коды ошибок EDEADLK, ENOLCK, ENOLNK, ENOSR, ENXIO или ERANGE.
Для SVr3 этот системный вызов может быть прерван и вернет
EINTR в любой ситуации, а не только до записи хотя бы одного байта
данных.
ЗАМЕЧАНИЯ
Успешное завершение
write
не гарантирует, что данные были записаны на диск. В действительности,
в некоторых реализациях, содержащих ошибки, не гарантируется даже
выделение места под данные. Единственный способ гарантировать запись
данных - это вызвать
fsync(2)
по окончании записи ваших данных.