Unix Man (Справочное руководство)

         

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: терминал

Пользователь может разрешить или запретить передачу сообщений на свой терминал, используя команду . Передача сообщений в режиме по умолчанию разрешена. Некоторые команды, в частности , блокируют прием сообщений с тем, чтобы воспрепятствовать смешиванию сообщений с выводимой ими информацией; однако, если пользователь обладает правами суперпользователя, то он может осуществлять передачу принудительно, несмотря на установленный адресатом запрет приема сообщений на терминал.

Если строка начинается с символа !, то команда write вызывает shell для исполнения остальной части строки как команды.

При использовании команды write рекомендуется придерживаться следующего протокола: если Вы только что выдали команду write, то дождитесь ответа адресата, прежде чем что-либо ему передавать. Каждый должен заканчивать сообщение каким-нибудь четко различимым признаком конца [например, (o) вместо "over" - конец сообщения], чтобы партнер знал, когда отвечать. В качестве признака завершения сеанса связи рекомендуется передавать (oo) (вместо "over and out" - конец сообщения и сеанса).

ФАЙЛЫ

/etc/utmp Для идентификации пользователя. /bin/sh для отработки "!".

СМ. ТАКЖЕ


, , , , .

ДИАГНОСТИКА


Пользователь not logged in

Пользователь, которому Вы пытаетесь передать сооб щение, не работает в системе.

Permission denied

Пользователь, которому Вы пытаетесь передать сооб щение, не дает на это разрешения.

Warning: cannot respond, set mesg -y

Ваш терминал находится в режиме mesg -n и адресат не может вам ответить.

Can no longer write to user

Адресат отменил разрешение (посредством mesg -n) после того, как Вы начали передачу сообщения.


Для псевдоустройств, если флаг O_NDELAY не установлен и поток не может принять данные (очередь записи полна в силу внутренних причин), записывающий процесс откладывается до тех пор, пока поток не будет готов к приему данных. Установленный флаг O_NDELAY предотвращает откладывание, и в описанном случае вызов write завершается неудачей. Если флаг O_NDELAY установлен и в момент, когда случилось событие, в результате которого поток перестал принимать данные, часть буфера записана, выполнение системного вызова write завершается и выдается количество записанных байт.

Системный вызов write завершается неудачей и указатель текущей позиции файла остается без изменений, если выполнено хотя бы одно из следующих условий:

[EAGAIN] Установлены флаги учета блокировки файла и O_NDELAY, и требуемый сегмент файла заблокирован. [EAGAIN] Общее количество системной памяти, предоставленной для бесструктурного ввода/вывода, временно оказалось недостаточным. [EAGAIN] При установленном флаге O_NDELAY попытка записи в поток, который не может принять данные. [EBADF] Аргумент fildes не является корректным дескриптором файла, открытого для записи. [EDEADLK] Попытка ожидания записи приводит к тупику. [EFAULT] Аргумент buf указывает за пределы отведенного процессу адресного пространства. [EFBIG] Превышение допустимого размера файлов [см. ]. [EINTR] Во время выполнения системного вызова перехвачен сигнал. [EINVAL] Попытка записи в поток, который мультиплексируется. [ENOLCK] Нет свободного места в системной таблице блокировок. [ENOLINK] Fildes является дескриптором файла на удаленном компьютере, связи с которым в данный момент нет. [ENOSPC] При попытке записи в обычный файл нет свободного места на устройстве. [ENXIO] Зависание при записи в поток stream. [EPIPE или сигнал SIGPIPE] Попытка записи в канал, который не открыт каким-либо процессом на чтение. [ERANGE] Попытка записи в поток при значении nbyte, выходящем за пределы допустимых размеров пакета, при ненулевом минимально допустимом размере пакета.



При попытке записать большее количество байт, чем позволяет максимальный размер файла [см. ] или наличие свободного пространства на устройстве, записывается столько байт, сколько возможно. Например, пусть в файле осталось 20 байт до достижения максимального размера. Тогда попытка записи в этот файл 512 байт приводит к тому, что реально пишется 20 байт и системный вызов write возвращает значение 20. Последующая попытка записи ненулевого количества байт приводит к ошибке (за исключением случаев, описанных ниже).

При установленном флаге O_NDELAY запись в полный канал приводит к возврату значения 0. Если флаг O_NDELAY не установлен, запись в полный канал задерживается до тех пор, пока не освободится пространство для записи.

Запись в файл-псевдоустройство может завершиться неудачей, если в истоке потока получено сообщение об ошибке. Тогда переменной errno присваивается значение, содержащееся в этом сообщении.

СМ. ТАКЖЕ



, , , , , , , .

ДИАГНОСТИКА



При успешном завершении результат равен неотрицательному целому числу - количеству реально записанных байт; в случае ошибки возвращается -1, а переменной errno присваивается код ошибки


Содержание раздела