2011-05-24 181 views
1

我在写一个执行服务器 - 客户端关系的程序。
在程序中,我使用select()以获取客户端的请求,以及用户从stdin发出的请求(服务器后面的请求)。
它似乎是select()适合客户的要求,但似乎没有回应来自stdin的输入。
此外,我没有成功从stdinrecv()。 有没有办法以非阻塞的方式从stdin获取输入?我试过使用fgets()而不是select(),并且我已经将fcntl()设置为非阻塞,它似乎不起作用 - 它仍然阻塞。使用select()从stdin读取 - 以非阻塞的方式

你有什么建议? 谢谢。

+0

您可以发布基于怎样你试过一些代码? – cpx 2011-05-24 07:29:44

+0

winsock意味着windows? ;)我认为select()仅适用于Windows上的套接字,文件处理程序不能通过select来处理,但可以在Unix上获得文件描述符并将其添加到FD_SET – tvn 2011-05-24 07:49:59

+0

什么是stdin连接到常规文件?管?插座?它是如何打开的?尝试发布展示该问题的小程序。 – Gilles 2011-05-24 08:26:32

回答

1

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

+1

行缓冲是C或C++标准库流的函数,在诸如'recv()'和'select()'等POSIX I/O系统调用级别上没有意义。对于问题中的“stdin”,如果有帮助,请阅读“STDIN_FILENO”。 – JdeBP 2011-05-24 13:48:31

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; 
}