c / expert
Snippet
Asynchrone Sicherheit mit sig_atomic_t
'sig_atomic_t' ist ein Ganzzahltyp, auf den selbst bei asynchronen Interrupts (Signalen) atomar zugegriffen werden kann. In Kombination mit 'volatile' wird verhindert, dass der Compiler die Variable in einem Register zwischenspeichert, sodass die Hauptschleife die vom Signal-Handler vorgenommene Änderung erkennt.
snippet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>#include <signal.h>#include <unistd.h>volatile sig_atomic_t keep_running = 1;void handle_sigint(int sig) {keep_running = 0;}int main() {signal(SIGINT, handle_sigint);printf("Running loop. Press Ctrl+C to stop...\n");while (keep_running) {// Simulate work}printf("Clean exit.\n");return 0;}
Erklärung
1
volatile sig_atomic_t keep_running
Garantiert, dass Lese-/Schreibzugriffe relativ zu Signalen atomar sind und umgeht Compiler-Optimierungen.
2
keep_running = 0;
Sicher innerhalb eines Signal-Handlers ausführbar, da die Operation garantiert atomar ist.