繁体   English   中英

随后使用STDIN和STDOUT

[英]Using STDIN and STDOUT subsequently

我正在用C编写可以在终端中使用的聊天...

为了接收短信,我有一个线程可以在STDOUT上打印出该消息

另一个线程正在从标准输入中读取...

问题是,如果在键入时将新消息打印到stdout,它将在我键入的内容之间打印。

我研究了几个小时的GNU readline实验,以防止出现此问题。 我认为“重新显示”功能将在这里为我提供帮助。.但是,如果我使用某些重新显示功能(它表示ld:未定义符号),而其他功能正常运行,则无法在Mac OSX上编译我的程序。一台Ubuntu机器就可以了...我真的不知道为什么...

但是,如何实现写入stdout的所有内容都超过我当前正在编写的文本?

您基本上有两种解决方案。

第一种是使用可帮助您将屏幕分成不同部分的方法,正如@Banthar所说, ncurses是标准解决方案。

第二个是同步您的著作和阅读。 从网络读取并写入控制台的线程可能只是将消息推迟,直到您从键盘上输入了内容为止,那时您可以通过一次写入所有消息来刷新消息缓冲区。 注意:此解决方案可能会导致缓冲区溢出,您可能会忘记太旧的消息或在缓冲区已满时刷新缓冲区。

如果您要求仅使用stdin和stdout(即哑终端),则必须首先将控制台输入配置为没有行缓冲,这是默认设置(在Unix之类的系统上,为stty -icanon )。 不幸的是,我找不到以编程方式实现此目标的可移植方式,但是您将在关于SO的另一个问题中找到更多关于此的方法, 如何避免使用任何getchar()的回车键

然后,您将必须逐字符整理下一个外发邮件。 因此,当准备在编写输出消息的过程中准备好传递输入消息时,您可以跳上一行,编写输出消息(最终跳出另一行或执行通常的提示操作)并重写输入缓冲区,以便用户准确输入他已经输入的所有字符。

您将必须使用一种互斥方式,以避免在输出线程完成所有工作时,输入线程可以对输入缓冲区进行任何访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM