Примечание
Этот ответ может быть совершенно бесполезным, если вы пишете код микроконтроллера, используя что-то вроде 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
, и я знаю лучше, чем делать что-либо кроме установки флага в обработчике сигналов, но, надеюсь, люди, которые знают, как правильно их использовать, могут отредактировать ответ, чтобы решить проблемы.