使用select()从stdin读取 - 以非阻塞方式

时间:2011-05-24 07:22:53

标签: c++ linux stdin nonblocking

我正在编写一个执行服务器 - 客户关系的程序 在程序中,我使用select()来获取客户端的请求,以及用户的请求(服务器后面的请求)来自stdin。
看起来似乎是select()适用于客户的请求,但似乎没有响应stdin的输入。
此外,我没有成功recv() stdin。 有没有办法以非阻塞方式从stdin获取输入?我尝试使用fgets()代替select(),并且我已将fcntl()设置为非阻止,但它似乎无效 - 它仍然是阻止的。

你有什么建议? 感谢。

2 个答案:

答案 0 :(得分:1)

stdin是行缓冲的 - 你无法以非阻塞的方式读取它。

答案 1 :(得分:0)

您始终可以使用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;
}