我正在为自定义脚本语言编写一个 linux shell,我想在用户为单个语句输入的每个后续行之前打印一个“...”,第一行有一个“>>>”打印出来,然后等待输入。下面是一个例子:
>>> void f() {
... "this is a test"
... }
>>>
我正在阅读带有 fgets
的行,在我完全阅读它之后,我打印“...”,并使用对 fgets
的另一个调用重复。这适用于中等速度的交互式输入。但是如果我将包含换行符的代码粘贴到终端中,我得到的是以下内容
>>> void f() {
"this is a test"
}
... ... >>>
“...”打印得太晚了,即使我在将它们打印到 stdout
之后发出了一个 fflush
调用。有谁知道是否有什么特别的事情要做才能使这项工作正常进行?
最佳答案
如果您关闭终端的 echo(请参阅 stty(1)
-echo
),那么您可以完全控制输入何时打印到屏幕上.
我的假设是粘贴导致所有行立即写入终端,并且您的程序将永远没有机会在必要时将输出发送到终端。因此,如果您关闭 echo 并在用户输入时打印用户输入,您可以在看到换行符时执行特殊处理。
您可以看到 irb
程序通过在其上运行 strace
做了非常相似的事情:
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
...
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = 0
关于c++ - 如何同步终端上的输入和输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5346445/