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

发布于 2024-11-09 12:16:04 字数 380 浏览 1 评论 0原文

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

你有什么建议? 谢谢。

i'm writing a program that perform server-client relations.
In the program, i'm using select() in order to get the client's requests, and also the user's requests(the one behind the server) from the stdin.
What it seems to be is that the select() works fine for the client's requests, but doesn't seem to respond to the input from the stdin.
Also, i don't succeed to recv() from the stdin.
Is there a way to get an input from the stdin in a non-blocking way? I've tried using fgets() instead of select(), and tho i've set the fcntl() to be non-blocking, it doesn't seem to work - it is still blocking.

What do you suggest?
Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉城凉梦凉人心 2024-11-16 12:16:04

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

stdin is line-buffered - you cannot read from it in a non-blocking way.

找个人就嫁了吧 2024-11-16 12:16:04

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

You could always use kbhit to see if there are any characters on the input buffer ready to be read.

In the event you do not have access to kbhit, here is a simple implementation I have used in the past:

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文