Есть ли способ установить ограничение по времени для fgets ()? - PullRequest
0 голосов
/ 15 марта 2020

Я запускаю консоль, используя fgets () в микроконтроллере. Если я оставляю консоль в режиме ожидания слишком долго, пока fgets () запрашивает команды, срабатывает сторожевой таймер.

Интересно, можно ли установить ограничение по времени для fgets (), чтобы, если пользователь не предоставляет команды через определенное время, истекает fgets ()?

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Примечание

Этот ответ может быть совершенно бесполезным, если вы пишете код микроконтроллера, используя что-то вроде HI-TECH C или Keil C51 . В этих случаях вам придется использовать какое-то платформо-зависимое решение.

В этом примере много чего не так, но он показывает, как прервать fgets:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <setjmp.h>

sigjmp_buf context;

volatile int alarm_occurred = 0;

void alarm_handler(int signum) {
    alarm_occurred = 1;
    siglongjmp(context, -1);
}

int main() {
    char buffer[80];

    signal(SIGALRM, alarm_handler);

    while (1) {
        char *result;
        if (sigsetjmp(context, 1) == 0) {
            // The call to sigsetjump will cause flow to go here
            alarm(3);
            printf("Enter a string: ");
            result = fgets(buffer, sizeof(buffer), stdin);
        }
        else {
            // The call to siglongjump will cause flow to go here
            printf("\n");
            continue;
        }
    }

    return 0;
}

Вывод

Enter a string: 
Enter a string: 
...
Enter a string: 

Я никогда раньше не использовал sigsetjmp или siglongjmp, и я знаю лучше, чем делать что-либо кроме установки флага в обработчике сигналов, но, надеюсь, люди, которые знают, как правильно их использовать, могут отредактировать ответ, чтобы решить проблемы.

0 голосов
/ 16 марта 2020

Вы можете использовать функцию sleep () для установки ограничения по времени.

bool Time = True;

#define wait 1000

int i = 0;

while(i<=wait) 
{

 char *result;
 input = scanf();         // if the input is provided 
 if(input) 
{
 result = fgets() ;
 break;                         //breaks if the input is provided
}
Sleep(10) ;                  // before each iteration a delay of 10ms
i++;

}
...