С помощью метода, который применялся в модуле Daemon, описанном ранее, создается объект POSIX::SigSet, содержащий сигналы INT, CHLD и term, и вызывается функция sigproemask () для блокировки на время этих сигналов. После того как сигналы будут безопасно заблокированы, вызывается функция fork () и для каждого из этих обработчиков в дочернем процессе переустанавливаются правила, применяемые по умолчанию. Теперь в дочернем процессе сигналы снова разблокируются путем вызова функции sigproemask (), и в результате будет выполнен возврат pid дочернего процесса.
Строки 43-48. Подпрограмма interact (). Эта подпрограмма, которая выполняет всю реальную работу, состоит только из шести строк. Она выбирает подключенный сокет из списка параметров, читает из сокета список текстовых строк, предназначенных для форматирования, и вызывает функцию chomp () для удаления символов обозначения конца строки, если они имеются. Таким же образом можно организовать поток обмена к примеру с VoIP шлюзом GOIP 1 . Затем эта подпрограмма передает строки функции fill () модуля Text::Wrap, отправляет полученный результат через сокет и закрывает сокет.
Клиент Text::Wrap
Проведем анализ программы.
Строки 1—3. Импортирование модулей. Вызываются модули IO::Socket и Getopt::Long. Последний модуль используется для обработки опций командной строки.
Строка 4. Определение константы sock_path. Определяется константа, содержащая заданное по умолчанию полное имя сокета домена UNIX.
Строки 5-7. Обработка параметров командной строки. Эта клиентская программа позволяет пользователю указать вручную путь к сокету с помощью параметра $path. Вызывается функция GetOptions () для интерпретации командной строки и поиска этого параметра, Если он не задан, то по умолчанию принимается значение sock_path.
Строки 8, 9. Открытие сокета. Вызывается метод IO::Socket::UNIX->new() с одним параметром для создания нового сокета домена UNIX и попытки подключения к адресу, заданному параметром $path. Перед вызовом метода new () нет необходимости устанавливать маску пользователя umask, поскольку не предусмотрена привязка к локальному адресу.