C语言如何非阻塞输入(检查 stdin 是否有内容)

getchar,scanf,getch,这些,如果用户没有输入就会阻塞,如果不希望阻塞,应该怎么办?
网上搜了一下,Linux可以用 fcntl,但 Windows 就不行了(可以用 GetAsyncKeyState 检查按键,但是不能知道stdin 是否有内容)

阅读 10.3k
3 个回答

Windows有的。
用_kbhit()(因为是立即返回的,你可能要放到循环里),判断是不是有键按下,然后用_getch()取走。

windwos上有ioctl可以实现,不过这只是设置文件描述符的属性而已,非阻塞的输入还是要配置对应的API才行

找到一个例子不知道是不是你想要的,socket和IO使用的文件描述符是一样的

set nonblock

这些东西都是可以谷歌出来的。。

关于非阻塞函数,首先,我在这里列举一个demo

/* This program loops until the user
* presses a key. If _kbhit returns nonzero, a
* keystroke is waiting in the buffer. The program
* can call _getch or _getche to get the keystroke.
*/

#include <conio.h>
#include <stdio.h>

int main( void )
{
   /* Display message until key is pressed. */
   while( !_kbhit() )
      _cputs( "Hit me!! " );

   /* Use _getch to throw key away. */
   printf( "\nKey struck was '%c'\n", _getch() );
}

输出结果为:

总结:

从函数的架构可以看出,kbhit()是一个C和C++函数,用于非阻塞地响应键盘输入事件。其原理是检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。

真诚的希望我的回答可以帮到你和遇到这个问题的其他朋友!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题