我在微控制器中使用 fgets() 运行控制台。如果我在 fgets() 提示输入命令时让控制台闲置时间过长,则会触发看门狗计时器。
我想知道是否可以对 fgets() 设置时间限制,这样如果用户在一定时间后不提供命令, fgets() 就会过期?
我在微控制器中使用 fgets() 运行控制台。如果我在 fgets() 提示输入命令时让控制台闲置时间过长,则会触发看门狗计时器。
我想知道是否可以对 fgets() 设置时间限制,这样如果用户在一定时间后不提供命令, fgets() 就会过期?
笔记
如果您使用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
以前从未使用过,而且除了在信号处理程序中设置标志之外,我知道最好不要做任何事情,但希望知道如何正确使用这些的人可以编辑答案以解决问题。