加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何在终端上同步输入和输出?

发布时间:2020-12-16 06:55:58 所属栏目:百科 来源:网络整理
导读:我正在为自定义脚本语言编写一个 linux shell,我想在用户为单个语句输入的每个后续行之前打印一个“…”,第一行有一个“ ;“打印,然后等待输入.以下是一个例子: void f() {... "this is a test"... } 我正在阅读fgets的这一行,在我完全阅读之后,我打印出“
我正在为自定义脚本语言编写一个 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读