2016-04-16 8 views
0

Scheint wie eine wirklich einfache Aufgabe, aber ich habe eine wirklich harte Zeit zu identifizieren, das Ende der Eingabe über PHP nach stdin [5.5.x]. Anstatt ein 0x04 EOT-Zeichen zu übergeben, um die letzte Zeichenfolge zu überdecken, scheint fgets(STDIN) sich dafür zu entscheiden, auf die Eingabe mit keinem erkennbaren Signal zu warten. Die naheliegendste Demonstration ist durch den Code "Eingabe empfangen"Erkennen von EOT von stdin in PHP

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

Nach Ctrl + D, wobei die Schleife strafft sofort und wiederholt Verschüttet in stdout, anstatt das EOT zu erkennen oder auf weitere Eingaben zu warten. Warum ist das?

Antwort

0

Partielle Antwort: Sowohl

  1. \x04 über das Rohr verläuft und durch Vergleichen gegen die 0x04 literal und
  2. vorbei \u0004 und Vergleichen gegen einen EOT Charakter [NodeJS die child_process Verwendung] erstellt von mb_convert_encoding('&#x0004;', 'UTF-8', 'HTML-ENTITIES')

erfolgreich und ermöglichen das Programm zu beenden. Die Anwendung des letzteren Vergleichs auf \x04 hat den gleichen Effekt Ctrl + D verwendet und weiterhin zu haben.