Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

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

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...