#include #include #include #include #include "signal_support.h" volatile sig_atomic_t should_exit; volatile sig_atomic_t is_blocked; volatile sig_atomic_t is_pending; void alarm_went_off(int sig, siginfo_t *info, void *_context); void fast_block(void) { is_blocked++; } void fast_unblock(void) { if ((--is_blocked == 0) && is_pending) alarm_went_off(SIGALRM, NULL, NULL); } void alarm_went_off(int sig, siginfo_t *info, void *_context) { if (is_blocked) { is_pending = 1; return; } is_pending = 0; printf("Alarm went off\n"); should_exit = 1; } int main() { signal_set_handler(SIGALRM, alarm_went_off); alarm(3); printf("main program running...\n"); while (!should_exit) { for (int i = 0; i < 300000000; i++) { volatile int sqi = i * i; } fast_block(); printf("main program here...\n"); fast_unblock(); } printf("main program done...\n"); }