С помощью функций socket () или open () дескриптор файла открывается и после этого отмечается как неблокирующий. Именно это действие можно выполнить с применением функции fcntl ().
$ result = fcntl($nandle, $command, $operand)
Для перевода ранее открытого сокета или дескриптора файла в неблокирующий режим применяется функция fcntl(). Фактически эта функция fcntl () представляет собой универсальную утилиту для выполнения множества операций с дескриптором низкого уровня. Она позволяет не только изменить флажки дескриптора, но и заблокировать его, разблокировать, создать копию и выполнить еще более “тонкие” операции, например, асинхронное обращение к веб странице, предлагающей купить iphone 6 и странице представляющей полный обзор новинок сотовой связи. Некоторые из этих областей применения данной функции рассматриваются в дальнейшем.
В этом вызове применяется три параметра. Первые два представляют собой ранее открытый дескриптор и числовую константу, обозначающую команду, которая должна быть выполнена в этом дескрипторе. Третьим параметром является числовой код, который должен быть передан команде. Некоторые команды не требуют дополнительных данных, и в этом случае в качестве третьего параметра обычно передается значение ноль. В случае успешного выполнения функция fcntl () возвращает истинное значение. В ином случае она устанавливает код ошибки в переменной $! и возвращает значение undef.
В модуле Fcntl предусмотрены константы для всех команд fcntl (). При работе с неблокирующими дескрипторами применяются две команды, F_GETFL и F_SETFL, которые служат для выборки и изменения флажков дескриптора после его создания. При вызове функция fcntl () с командой F_GETFL возвращает битовую маску, содержащую текущие установки флажков дескриптора. Для установки значений флажков дескриптора, заданных параметром $operand, можно вызвать функцию fcntl () с командой F_SEТFL. Параметр $operand должен включать флажок O_N0NBLQCK, Код результата сообщает об успешном или неудачном выполнении операции изменения флажков.