WRITE(2)
НАЗВАНИЕ
write - запись в файл
СИНТАКСИС
int write (fildes, buf, nbyte)
int fildes;
char *buf;
unsigned nbyte;
ОПИСАНИЕ
Аргумент fildes - это дескриптор файла, полученный после выполнения системных вызовов creat(2), open(2),
dup(2), fcntl(2) или pipe(2).
Системный вызов write пытается записать nbyte байт из
буфера, на который указывает аргумент buf, в файл, ассоциированный с дескриптором fildes.
Для устройств, допускающих позиционирование, системный
вызов write выполняет запись в файл, начиная с указателя текущей позиции, ассоциированного с дескриптором
fildes. После завершения записи указатель текущей позиции файла увеличивается на количество записанных байт.
Для устройств без возможности позиционирования запись
всегда выполняется с текущей позиции. Значение указателя текущей позиции файла для такого устройства неопределено.
Если установлен флаг статуса файла O_APPEND, то перед
каждой записью указатель текущей позиции позиционируется на конец файла.
Для обычных файлов, если установлен флаг статуса файла
O_SYNC, системный вызов write ожидает физического обновления как данных файла, так и его статуса. Эта опция
предназначена для специальных приложений, в которых
требуется дополнительная надежность даже за счет потери
производительности. Для блочных специальных файлов, если установлен флаг O_SYNC, выполнение вызова write не
завершится до тех пор, пока данные не будут физически
обновлены.
Запись в обычный файл блокируется, если установлен флаг
учета блокировки [см. chmod(2)] и тот сегмент файла, в
который производится попытка записи, заблокирован другим процессом. В этом случае, если не установлен флаг
O_NDELAY, записывающий процесс откладывается до снятия
блокировки сегмента.
Для псевдоустройств [см. intro(2)] на выполнение операции write влияют минимальное и максимальное возможные
значения аргумента nbyte ("размер пакета"), допустимые
для данного потока. Эти значения содержатся в модуле
потока, ближайшем к истоку. Если модуль не помещен в
поток пользователем [см. опцию I_PUSH в streamio(7)],
то эти значения не могут быть установлены или опрошены
на пользовательском уровне. Если значение аргумента
nbyte лежит в интервале изменений размера пакета, то
записывается nbyte байт, если же значение аргумента
nbyte не лежит в этом интервале и минимальный размер
пакета равен 0, то вызов write перед посылкой данных в
поток разбивает буфер на сегменты максимально допустимой длины пакета (размер последнего сегмента может быть
меньше максимального). Если значение аргумента nbyte не
лежит в интервале изменений размера пакета и минимальный размер не равен 0, то write завершается неудачей с
кодом ошибки ERANGE. Запись буфера нулевой длины (значение аргумента nbyte равно 0) приводит к посылке нулевого количества байт и возврату нулевого значения.
Для псевдоустройств, если флаг O_NDELAY не установлен и
поток не может принять данные (очередь записи полна в
силу внутренних причин), записывающий процесс откладывается до тех пор, пока поток не будет готов к приему
данных. Установленный флаг O_NDELAY предотвращает откладывание, и в описанном случае вызов write завершается
неудачей. Если флаг O_NDELAY установлен и в момент,
когда случилось событие, в результате которого поток
перестал принимать данные, часть буфера записана, выполнение системного вызова write завершается и выдается
количество записанных байт.
Системный вызов write завершается неудачей и указатель
текущей позиции файла остается без изменений, если выполнено хотя бы одно из следующих условий:
- [EAGAIN]
- Установлены флаги учета блокировки файла и
O_NDELAY, и требуемый сегмент файла заблокирован.
- [EAGAIN]
- Общее количество системной памяти, предоставленной для бесструктурного ввода/вывода,
временно оказалось недостаточным.
- [EAGAIN]
- При установленном флаге O_NDELAY попытка
записи в поток, который не может принять
данные.
- [EBADF]
- Аргумент fildes не является корректным
дескриптором файла, открытого для записи.
- [EDEADLK]
- Попытка ожидания записи приводит к тупику.
- [EFAULT]
- Аргумент buf указывает за пределы отведенного процессу адресного пространства.
- [EFBIG]
- Превышение допустимого размера файлов [см.
ulimit(2)].
- [EINTR]
- Во время выполнения системного вызова перехвачен сигнал.
- [EINVAL]
- Попытка записи в поток, который мультиплексируется.
- [ENOLCK]
- Нет свободного места в системной таблице
блокировок.
- [ENOLINK]
- Fildes является дескриптором файла на удаленном компьютере, связи с которым в данный
момент нет.
- [ENOSPC]
- При попытке записи в обычный файл нет свободного места на устройстве.
- [ENXIO]
- Зависание при записи в поток stream.
- [EPIPE или сигнал SIGPIPE]
Попытка записи в канал, который не открыт
каким-либо процессом на чтение.
- [ERANGE]
- Попытка записи в поток при значении nbyte,
выходящем за пределы допустимых размеров
пакета, при ненулевом минимально допустимом
размере пакета.
При попытке записать большее количество байт, чем позволяет максимальный размер файла [см. ulimit(2)] или
наличие свободного пространства на устройстве, записывается столько байт, сколько возможно. Например, пусть
в файле осталось 20 байт до достижения максимального
размера. Тогда попытка записи в этот файл 512 байт приводит к тому, что реально пишется 20 байт и системный
вызов write возвращает значение 20. Последующая попытка
записи ненулевого количества байт приводит к ошибке (за
исключением случаев, описанных ниже).
При установленном флаге O_NDELAY запись в полный канал
приводит к возврату значения 0. Если флаг O_NDELAY не
установлен, запись в полный канал задерживается до тех
пор, пока не освободится пространство для записи.
Запись в файл-псевдоустройство может завершиться неудачей, если в истоке потока получено сообщение об ошибке.
Тогда переменной errno присваивается значение, содержащееся в этом сообщении.
СМ. ТАКЖЕ
creat(2), dup(2), fcntl(2), intro(2), lseek(2),
open(2), pipe(2), ulimit(2).
ДИАГНОСТИКА
При успешном завершении результат равен неотрицательному целому числу - количеству реально записанных байт; в
случае ошибки возвращается -1, а переменной errno присваивается код ошибки