c++ - 如何同步终端上的输入和输出?

标签 c++ c terminal stdout read-eval-print-loop

我正在为自定义脚本语言编写一个 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/

相关文章:

c++ - 关于标准中虚函数描述的一个问题

c++ - 为什么shared_ptr类型没有模板分配器参数?

c++ - 包括模块防护装置

c - c 中的未知类型名称

c - C 中的固定内存位置

bash - 从终端验证是否安装了 python 3

terminal - Jupyter 笔记本中的 Julia .jl

c++ - 多线程无法正常加入

terminal - 通过 ANSI 转义序列或 X11 转义序列禁用回显并设置原始终端模式

c - 为什么我不能按以下方式将 strcpy() 与 strtok() 一起使用