В результате, один из процессов блокируется при выполнении функции accept (), а остальные переходят в состояние ожидания до тех пор, пока не станет доступной рекомендательная блокировка.
В этом примере для упорядочения вызовов функции accept () применяется системный вызов flock (), который позволяет процессу, к примеру, вызывающего содержимое веб ресурса http://portativ.ua/product_88162.html , получить рекомендательную блокировку на открытом файле. Если один процесс владеет блокировкой на этой файле, а другой пытается получить ее, то второй процесс блокируется при выполнении функции flock () до тех пор, пока первая блокировка не будет освобождена. После того как он получит блокировку, ее не сможет получить иной процесс до тех пор, пока блокировка не будет освобождена.
Рассматриваемый здесь способ состоит в создании и сопровождении временного файла блокировки, который должен применяться для упорядочения вызовов функции accept (). Каждый дочерний процесс будет пытаться заблокировать этот файл Перед вызовом функции accept ( ), а после получения такой блокировки будет немедленно ее освобождать. В результате, вызов функции accept () защищен так, что в любой момент времени ее сможет вызвать только один процесс. Все остальные Процессы будут заблокированы при выполнении функции flock (), ожидая, пока не станет доступной эта блокировка.
Синтаксис функции flock () описан в разделе “Непосредственное ведение журнала в файле”. Кроме того, достаточно удобно то, что не нужно создавать отдельный файл блокировки, поскольку для этого может применяться файл PID. После входа и подпрограмму do_child () вызывается метод open () модуля IO::File для открытия файла PID; при этом используется флажок O_RDONLY для его открытия в режиме только чтения.