使用SELECT()以非阻塞的方式从标准输入读取 [英] reading from stdin using select() - in a nonblocking way

查看:14
本文介绍了使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆