WRITE(1) WRITE(1)
НАЗВАНИЕ
write - передача сообщений другому пользователю
СИНТАКСИС
write пользователь [линия]
ОПИСАНИЕ
Команда write копирует строки с Вашего терминала на
терминал другого пользователя. Команда прежде всего по-
сылает адресату сообщение:
Message from Ваше_имя (tty??) [дата]...
Как только связь будет успешно установлена, два звонка
известят Вас о том, что вводимая Вами информация будет
пересылаться.
В этот момент адресату следует послать Вам ответное со-
общение. Сеанс связи будет продолжаться до тех пор, по-
ка с Вашего терминала не будет считан символ конца фай-
ла, не будет послано прерывание или адресат не выполнит
команду mesg -n, после чего команда write передаст со-
общение EOT (конец передачи) на другой терминал и за-
вершит свое выполнение.
Если Вы хотите передавать сообщения пользователю, кото-
рый вошел в систему более одного раза, то указать, с
какой именно линией или терминалом следует установить
связь, можно посредством аргумента линия (например,
tty10); иначе адрес будет определен по первому упомина-
нию о пользователе в файле /etc/utmp, а Вам будет выда-
но сообщение:
пользователь is logged on more than one place.
You are connected to терминал
Other locations are:
терминал
Пользователь может разрешить или запретить передачу со-
общений на свой терминал, используя команду mesg(1).
Передача сообщений в режиме по умолчанию разрешена. Не-
которые команды, в частности pr(1), блокируют прием со-
общений с тем, чтобы воспрепятствовать смешиванию сооб-
щений с выводимой ими информацией; однако, если пользо-
ватель обладает правами суперпользователя, то он может
осуществлять передачу принудительно, несмотря на уста-
новленный адресатом запрет приема сообщений на терми-
нал.
Если строка начинается с символа !, то команда write
вызывает shell для исполнения остальной части строки
как команды.
При использовании команды write рекомендуется придержи-
ваться следующего протокола: если Вы только что выдали
команду write, то дождитесь ответа адресата, прежде чем
что-либо ему передавать. Каждый должен заканчивать со-
общение каким-нибудь четко различимым признаком конца
[например, (o) вместо "over" - конец сообщения], чтобы
партнер знал, когда отвечать. В качестве признака за-
вершения сеанса связи рекомендуется передавать (oo)
(вместо "over and out" - конец сообщения и сеанса).
ФАЙЛЫ
/etc/utmp Для идентификации пользователя.
/bin/sh для отработки "!".
СМ. ТАКЖЕ
mail(1), mesg(1), pr(1), sh(1), who(1).
ДИАГНОСТИКА
Пользователь not logged in
Пользователь, которому Вы пытаетесь передать сооб-
щение, не работает в системе.
Permission denied
Пользователь, которому Вы пытаетесь передать сооб-
щение, не дает на это разрешения.
Warning: cannot respond, set mesg -y
Ваш терминал находится в режиме mesg -n и адресат
не может вам ответить.
Can no longer write to user
Адресат отменил разрешение (посредством mesg -n)
после того, как Вы начали передачу сообщения.
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 прис-
ваивается код ошибки.
|