#include #include #include #include #include "signal_support.h" volatile sig_atomic_t should_exit; volatile sig_atomic_t signal_pending; volatile sig_atomic_t signal_isblocked; void alarm_went_off(int sig, siginfo_t *info, void *_context); static void fast_block() { signal_isblocked++; } static void fast_unblock() { if (--signal_isblocked == 0 && signal_pending) { alarm_went_off(SIGALRM, NULL, NULL); } } void alarm_went_off(int sig, siginfo_t *info, void *_context) { if (signal_isblocked) { signal_pending = 1; return; } signal_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"); }