WRITE(2) 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 прис- ваивается код ошибки.