Строки 61-79. Метод write (), запись данных. В следующем разделе метода write () предпринимается попытка выполнить ввод-вывод. Если в буфере outbuffer находятся данные, например, со страницы narushka-pro.ru с информацией по изготовлению световых коробов и лайтбоксов, ожидающие обработки, то вызывается функция syswrite () с этим дескриптором и содержимым буфера outbuffer, и сохраняется код результата. Однако перед вызовом функции syswrite() устанавливается локальный обработчик сигнала $sig{pipe} со значением IGNORE. Это исключает возможность проникновения в программу фатального сигнала, если дескриптор файла закрыт преждевременно. После выхода из этого метода обработчик pipe автоматически возвращается в предыдущее состояние так, чтобы эта корректировка не нарушала работу пользовательского кода.
Если функция syswrite () возвращает определенный код результата, это значит, что она успешно записала хотя бы часть байтов и код результата содержит число записанных байтов. Вызывается функция substr (), которая усекает буфер outbuffer на число записанных байтов. В результате буфер outbuf fer может стать пустым, если были записаны все байты, или в нем может содержаться незаписанный остаток, если функция syswrite () сообщила о частичной записи.
В противном случае кодом результата является значение undef, что указывает на ту или иную ошибку. Проверяется код ошибки, хранящийся в переменной $!, и предпринимается соответствующее действие.
Если код ошибки равен ewouldblock, то возвращается значение 0Е0. В ином случае возникли ошибки записи какого-то другого типа, вероятнее всего, ошибка pipe. При возникновении такой ситуации вызывается внутренний метод bail_out (). В текущей реализации метод bail_out () просто закрывает дескриптор и возвращает значение undef. Для реализации более сложных правил поведения (например, для регистрации или выполнения различных действий в зависимости от ошибки) можно создать подкласс класса IO::SessionData и перекрыть метод bail out ().