чтение из stdin с использованием select () - неблокирующим способом - PullRequest
1 голос
/ 24 мая 2011

Я пишу программу, которая выполняет отношения между сервером и клиентом.
В программе я использую select() для получения запросов клиента, а также запросов пользователя (тот, что находится за сервером)из стандартного ввода.
Кажется, что select() отлично работает для запросов клиента, но, похоже, не отвечает на входные данные stdin.
Кроме того, я непреуспеть в recv() из stdin.Есть ли способ получить вход от стандартного ввода неблокирующим способом?Я попытался использовать fgets() вместо select(), и, тем не менее, я установил fcntl() неблокирующим, он, похоже, не работает - он все еще блокируется.

Что вы предлагаете?Спасибо.

Ответы [ 2 ]

1 голос
/ 24 мая 2011

stdin буферизован строкой - вы не можете читать с него неблокирующим способом.

0 голосов
/ 24 мая 2011

Вы всегда можете использовать 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;
}
...