使用SELECT()以非阻塞的方式从标准输入读取 [英] reading from stdin using select() - in a nonblocking way
本文介绍了使用SELECT()以非阻塞的方式从标准输入读取的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在编写一个执行服务器-客户端关系的程序。
在程序中,我使用select()
来获取客户端的请求,以及来自标准输入的用户请求(服务器后面的请求)。
看起来,select()
对于客户端的请求运行良好,但似乎不响应来自stdin
的输入。
而且,我没有从stdin
成功地recv()
。
有没有办法以非阻塞的方式从标准输入中获取输入?我尝试使用fgets()
而不是select()
,虽然我已经将fcntl()
设置为非阻塞,但它似乎不起作用-它仍然是阻塞的。
你有什么建议? 谢谢。
推荐答案
您始终可以使用kbhit查看输入缓冲区上是否有可供读取的字符。
如果您无法访问kbhit
,下面是我过去使用的一个简单实现:
int kbhit() {
int count = 0;
struct termios otty, ntty;
tcgetattr(STDIN_FILENO, &otty);
ntty = otty;
ntty.c_lflag &= ~ICANON;
if(tcsetattr(STDIN_FILENO, TCSANOW, &ntty) == 0) {
ioctl(STDIN_FILENO, FIONREAD, &count);
tcsetattr(STDIN_FILENO, TCSANOW, &otty);
}
return count;
}
这篇关于使用SELECT()以非阻塞的方式从标准输入读取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文