Функции работы со связными портами
С помощью связных портов различные задачи и процессы, одновременно работающие в Амиге, общаются между собой В ARexx-e порты используются чрезвычайно интенсивно как для посылки сообщений операционной системе, так и для общения с другими ARexx-программами. ARexx-контроль над связными портами значительно беднее, нежели чем в языке С. Тем не менее, имеющиеся функции могут оказаться весьма и весьма полезными.
Необходимо иметь в виду, что в описании функций все ссылки на т.н. "пакеты" (которые по сути являются С-шными структурами RexxMsg) представляют собой 32-разрядные адреса, записываемые с помощью hex-строк (например '7acf 54е2'х).
CLOSEPORT()res = CLOSEPORT(<имя>)
Закрыть порт, идентифицированный по его "имени". Можно закрывать только порты, открытые в этой же ARexx-программе с помощью функции OPENPORT(). Возвращается булевское значение TRUE в случае успешного закрытия порта.
GETARG()res = GETARG(<пакет>[,номер])
Функция выуживает команду, имя функции или строку аргументов из полученного пакета. "Пакет" должен быть адресом, возвращенным функцией GETPKT(). Если определен "номер" аргумента, то возвращается только аргумент в этой позиции ("номер" аргумента не должен превышать общее число аргументов "пакета").
GETPKT()res = GETPKT(<имя>)
Возвращает адрес пакета, находящегося первым в очереди, "подвешенной" к идентифицированному по "имени" связному порту (разумеется, порт уже должен быть открыт). Если "почтовый ящик" пуст, будет получено значение '0000 0000'х.
OPENPORT()res = OPENPORT(<имя>)
Функция создает оющедоступный (public) связной порт и присваивает ему "имя" (регистр букв "имени" должен учитываться при последующих обращениях к порту!). Возвращается адрес созданного порта, либо ноль '0000 0000'х в случае какой-либо неудачи (например, если мало памяти).
REPLY()res = REPLY(<пакет>,<код>)
Функция возвращает "пакет" пославшему его источнику, предварительно модифицировав значение поля первичного результата этого "пакета" в соответствии со значением параметра "код". Эта операция называется "ответом" на полученный ранее "пакет".
TYPEPKT()res = TYPEPKT(<пакет>[,<опция>])
Функция информирует о типе полученного "пакета". В случае отсутствия "опции" возвращается упакованное четырехбайтовое значение, распаковав которое можно получить требуемую информацию почти так же, как и явно использовав некоторую "опцию". Сначала рассмотрим вызов TYPEPKT() без "опции":
- Байт 0 - содержит число аргументов;
- Байт 2 - содержит флажки, которые были установлены при создании пакета. С этими флажками имеет дело функция REPLY() при ответе на присланный пакет;
- Байт 3 - имеет булевское значение TRUE (1), если пакет был вызван в качестве команды и 2, если пакет был вызван в качестве функции.
В случае спецификации опции 'A' (Arguments) функция возвратит число аргументов пакета. Опция 'С' (Command) возвратит TRUE, если пакет был вызван в качестве команды, либо - FALSE в противном случае. Опция 'F' (Function) возвратит TRUE, если пакет был вызван в качестве функции.
Следует учесть, что ARexx-программы для интерпретатора текущей версии (1.15) не следует рассматривать в качестве надежного "хозяина" для других ARexx-процессов; в силу этого вызовы портов других ARexx-процессов должны быть вызовами команд, а не функций (по умолчанию строка аргументов для этого случая должна быть единственной).
WAITPKT()res = WAITPKT(<имя>])
Функция ожидает прихода пакета в указанный "именем" связной порт (порт должен быть открыт на момент исполнения WAITPKT()). После получения пакета следует использовать функции GETPKT() и REPLY().