0

我在微控制器中使用 fgets() 运行控制台。如果我在 fgets() 提示输入命令时让控制台闲置时间过长,则会触发看门狗计时器。

我想知道是否可以对 fgets() 设置时间限制,这样如果用户在一定时间后不提供命令, fgets() 就会过期?

4

1 回答 1

0

笔记

如果您使用HI-TECH CKeil 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: 

我从未使用过sigsetjmpsiglongjmp以前从未使用过,而且除了在信号处理程序中设置标志之外,我知道最好不要做任何事情,但希望知道如何正确使用这些的人可以编辑答案以解决问题。

于 2020-03-15T22:09:38.463 回答