ustaw flagę w programie obsługi sygnału
W C ++ 11 jaki jest najbezpieczniejszy (i najskuteczniejszy) sposób wykonywania niebezpiecznego kodu na przechwytywanym sygnale, biorąc pod uwagę typ pętli żądania (jako część pętli żądania WWW)? Na przykład przy przechwytywaniu SIGUSR1 z linii poleceń linux:kill -30 <process pid>
Dopuszczalne jest, aby „niebezpieczny kod” był uruchamiany przy następnym uruchomieniu żądania, a żadne informacje nie zostaną utracone, jeśli sygnał zostanie wystrzelony wiele razy przed uruchomieniem niebezpiecznego kodu.
Na przykład mój obecny kod to:
static bool globalFlag = false;
void signalHandler(int sig_num, siginfo_t * info, void * context) {
globalFlag = true;
}
void doUnsafeThings() {
// thigns like std::vector push_back, new char[1024], set global vars, etc.
}
void doRegularThings() {
// read filesystem, read global variables, etc.
}
void main(void) {
// set up signal handler (for SIGUSR1) ...
struct sigaction sigact;
sigact.sa_sigaction = onSyncSignal;
sigact.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction(SIGUSR1, &sigact, (struct sigaction *)NULL);
// main loop ...
while(acceptMoreRequests()) { // blocks until new request received
if (globalFlag) {
globalFlag = false;
doUnsafeThings();
}
doRegularThings();
}
}
gdzie wiem, że mogą wystąpić problemy z testowaniem głównej pętli + ustawienie boolean globalFlag.
Edytuj: Theif (globalFlag)
test zostanie uruchomiony w dość ciasnej pętli, a „okazjonalny” fałszywy negatyw jest akceptowalny. Podejrzewam jednak, że i tak nie ma optymalizacji rozwiązania Basile Starynkevitch?