Решением для меня было установить режим -icanon
на TTY (используя stty
).Например:
1004
Итак, код, который сейчас работает:
#!/usr/bin/php
<?php
system("stty -icanon");
echo "input# ";
while ($c = fread(STDIN, 1)) {
echo "Read from STDIN: " . $c . "\ninput# ";
}
?>
Вывод:
input# fRead from STDIN: f
input# oRead from STDIN: o
input# oRead from STDIN: o
input#
Read from STDIN:
input#
Подсказка к ответу, приведенному здесь:
Есть ли способ ожидания и получения нажатия клавиши из (удаленного) сеанса терминала?
Для получения дополнительной информации см .:
http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html#AEN92
Не забудьте восстановить TTY, когда закончите с ним ...
Восстановление конфигурации tty
Сбросить терминал обратно в исходное состояниеЭто можно сделать, сохранив состояние tty, прежде чем вносить в него изменения.После этого вы можете восстановить это состояние, когда закончите.
Например:
<?php
// Save existing tty configuration
$term = `stty -g`;
// Make lots of drastic changes to the tty
system("stty raw opost -ocrnl onlcr -onocr -onlret icrnl -inlcr -echo isig intr undef");
// Reset the tty back to the original configuration
system("stty '" . $term . "'");
?>
Это единственный способ сохранить tty и вернуть его обратно, как это было у пользователя до этого.вы начали.
Обратите внимание, что если вы не беспокоитесь о сохранении исходного состояния, вы можете сбросить его обратно в стандартную "нормальную" конфигурацию, просто выполнив:
<?php
// Make lots of drastic changes to the tty
system("stty raw opost -ocrnl onlcr -onocr -onlret icrnl -inlcr -echo isig intr undef");
// Reset the tty back to sane defaults
system("stty sane");
?>