Завершение scanf программно на языке Си - PullRequest
1 голос
/ 30 октября 2010

Я программирую на языке Си в ОС Linux. Я пишу программу, которая сканирует ввод от пользователя. Однако я хочу, чтобы у scanf был определенный срок. Например, если пользователь ничего не вводит на клавиатуре в течение 10 секунд, он пропустит scanf и перейдет к следующей строке. Я использую Alarm (10), чтобы ждать 10 секунд, но когда я иду к обработчику сигналов, я не знаю, что делать, чтобы пропустить scanf.

Есть ли функция для пропуска сканирования или, например, записи \ n во входной буфер?

Ответы [ 3 ]

2 голосов
/ 30 октября 2010

Вы можете использовать select(2) или poll(2), чтобы указать время ожидания и проверить, есть ли у stdin ввод.

1 голос
/ 30 октября 2010

возврат из обработчика тревоги;Возвращаемое значение scanf должно отражать возникновение ошибки.(scanf возвращает EOF при ошибке).

ПРИМЕЧАНИЕ!Вы ДОЛЖНЫ использовать sigaction, так как signal может сделать read(), системный вызов, лежащий в основе scanf(), автоматически перезапускается.

#include <stdio.h>
#include <signal.h>

void handler(int signo)
{
  return;
}

int main()
{
  int x;
  struct sigaction sa;

  sa.sa_handler = handler;
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = 0;
  sigaction(SIGALRM, &sa, NULL);

  alarm(5);

  if (scanf("%d", &x) == 1)
  {
    printf("%d\n", x);
    alarm(0); // cancel the alarm
  }
  else
  {
    printf("timedout\n");
  }
  return 0;
}
0 голосов
/ 30 октября 2010

Возможно, вы захотите использовать ncurses вместо стандартного ввода-вывода.Это немного загадочно, но оно изолирует вас от всевозможных неудобств кодирования (и переносимости, и «вы должны кодировать это совершенно точно, иначе это не будет работать надежно, и удачи в поиске документации»).А функция halfdelay обеспечивает режим, который именно то, что вы ищете здесь.

...