После выполнения сценарий выводит содержимое переменной $count с указанием числа строк, которые были успешно записаны в канал. Вторая программа, считывает три строки текста из стандартного устройства ввода, а затем завершает свою работу.
Следует отметить, что первая программа переводит канал в режим автоматического сброса, чтобы каждая, строка текста немедленно отправлялась по каналу, а не записывалась в локальный буфер! Это очень важно и как правильно сделать смотрите здесь . Первый сценарий после записи каждой строки текста также предусматривает приостановку с помощью функции sleep() на одну секунду, что дает возможность сценарию два сообщить о том, что текст получен. Все эти действия, вместе взятые, позволяют легче разобраться в том, что происходит.
И все происходит в соответствии с нашими ожиданиями, после обработки сценарий два завершает свою работу. Когда сценарий один предпринимает попытку записать четвертую строку текста, происходит его аварийное завершение с ошибкой Broken pipe (канал разорван). Оператор вывода числа строк, успешно переданных по каналу, таки не будет выполнен.
Если программа на одном конце канала предпринимает попытку записи в канал, а на другом конце канала ни одна программа не выполняет чтение, такая ситуация приводит к возникновению исключения PIPE, которое, в свою очередь, вызывает отправку сигнала PIPE программе записи. По умолчанию этот сигнал приводит к немедленному завершению работы программы-нарушителя. Такая же ошибка возникает в сетевых приложениях, когда отправитель пытается передать данные в удаленную программу, которая завершила свою работу или прекратила прием данных. Чтобы успешно справиться с исключением PIPE, необходимо установить обработку сигналов.