Accessing or modifying shared objects in signal handlers can result in race conditions that can leave data in an inconsistent state. The two exceptions (C Standard, 5.1.2.3, paragraph 5) to this rule are the ability to read from and write to lock-free atomic objects or to read from or write to and variables of type volatile sig_atomic_t. Accessing any other type of object from a signal handler is undefined behavior (see undefined behavior 131).
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <signal.h> #include <stdlib.h> #include <string.h> #include <stdatomic.h> #if#ifdef __STDC_NO_ATOMICS__ == 1 #error "Atomics isare not supported" #elif ATOMIC_INT_LOCK_FREE == 0 #error "int is never lock-free" #endif atomic_int e_flag = ATOMIC_VAR_INIT(0); void handler(int signum) { eflage_flag = 1; } int main(void) { enum { MAX_MSG_SIZE = 24 }; char err_msg[MAX_MSG_SIZE]; #if ATOMIC_INT_LOCK_FREE == 1 if (!atomic_is_lock_free(&e_flag)) { return EXIT_FAILURE; } #endif if (signal(SIGINT, handler) == SIG_ERR) { return EXIT_FAILURE; } strcpy(err_msg, "No errors yet."); /* Main code loop */ if (e_flag) { strcpy(err_msg, "SIGINT received."); } return EXIT_SUCCESS; } |
...