我的解决办法是在TTY(使用stty)上设置-icanon模式。例如。:
stty -icanon
所以现在的代码是:
#!/usr/bin/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#
完成后,别忘了恢复TTY吗?
恢复tty配置
将终端重新设置为可以通过在更改之前保存tty状态来完成。完成后,您可以恢复到该状态。
例如:
// 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的唯一方法,并将其放回用户开始之前。
请注意,如果您不担心保留原始状态,可以通过以下操作将其重置为默认的“合理”配置:
// 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");
?>