2016-04-16 2 views
0

Кажется, это очень простая задача, но мне очень трудно определить конец ввода, переданный через stdin в PHP [5.5.x]. Вместо того, чтобы передавать символ 0x04 EOT для закрытия финальной строки, fgets(STDIN), похоже, решил прекратить ждать ввода без заметного сигнала. Наиболее очевидная демонстрация через код:Обнаружение EOT из stdin в PHP

<?php 
while(substr(rtrim(fgets(STDIN), PHP_EOL), -1) != 0x04) { 
    echo "Input received."; 
} 

После Ctrl + D, петля затягивает сразу и неоднократного «Input получил.» разливает в stdout вместо обнаружения EOT или ждет дальнейшего ввода. Почему это?

ответ

0

Частичный ответ: Оба

  1. прохождение \x04 через трубу и сравнение против 0x04 буквальных и
  2. прохождения \u0004 [с помощью NodeJS-х child_process] и сравнивающего против СРВА персонажа, созданного mb_convert_encoding('&#x0004;', 'UTF-8', 'HTML-ENTITIES')

преуспеть и разрешить программе завершить работу. Применение последнего сравнения к \x04 имеет тот же эффект Ctrl + D используется и продолжает иметь.