我正在尝试制作一个无需用户输入即可无限运行的循环,直到' Enter'被压了。 这是我的程序的简化版本:
do {
printf("Hello\n");
}while(!getchar());
当我编译并运行程序时,只输出一个' Hello'并且程序将不会继续,直到Enter按下然后程序将退出。我可以知道我错了哪一部分?
谢谢。
答案 0 :(得分:2)
这并不容易。您的问题是标准I / O功能是同步的。你的getchar
正在等待一些输入(输入行是准确的)并阻止执行程序直到按下Enter
。要在不阻塞的情况下继续执行,您需要使用异步I / O操作或select
(或poll
)。 Select
允许您检测下一个I / O操作是否会阻塞。查看select
的文档并尝试:
#include<stdio.h>
#include<unistd.h>
#include <sys/select.h>
int main() {
fd_set s;
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100000;
do {
printf("Hello\n");
fflush(stdout);
FD_ZERO(&s);
FD_SET(STDIN_FILENO, &s);
select(STDIN_FILENO+1, &s, NULL, NULL, &timeout);
} while (FD_ISSET(STDIN_FILENO, &s) == 0);
}
答案 1 :(得分:0)
在Linux上,终端是 tty ,它通常以某种方式由内核缓冲。阅读tty demystified和line discipline。
阅读getchar(3)手册页(例如,在终端中使用man 3 getchar
)。它说
getchar()返回读取的字符 unsigned char在文件结尾或错误时转换为int或EOF。
所以你的测试是错误的,你可能希望while(getchar() != EOF)
不等待某些键盘输入。换句话说,getchar
始终阻止用户输入。你可以用 Ctrl D
答案 2 :(得分:0)
你的程序被卡住了,因为getchar()函数正在等待输入。当你输入东西(输入)时,getchar()返回非零值,因此while语句变得错误,这就是循环结束的原因。
答案 3 :(得分:0)
需要弄清楚Canonical与非规范终端输入的区别
正如你在canonical
终端上尝试的那样,你现在已经有了什么限制。所以我只是向你解释non-canonical
终端
对于非规范输入 - 请考虑vi
或vim
或其他 - 您按下一个字符,它立即可供该程序使用。在你回归之前,你不会被阻止。系统不对字符进行编辑;键入后,它们即可供程序使用。程序可以适当地解释事物。现在,vim
确实做了许多看起来有点像规范输入的事情。例如,退格键向后移动,并在输入模式下删除那里的内容。但那是因为vim选择让它表现得那样。
所以你需要使用non-canonical flavor。