signal(): undefined behavior?



  • Hi,

    Ich zitiere http://en.cppreference.com/w/cpp/utility/program/signal :

    If the signal handler is called NOT as a result of std::abort or std::raise, the behavior is undefined if

    the signal handler calls any function within the standard library, except std::abort, std::_Exit, std::quick_exit, or std::signal with the first argument not being the number of the signal currently handled.
    the signal handler refers to any object with static or thread-local(since C++11) storage duration that is not std::atomic(since C++11) or volatile std::sig_atomic_t.

    Ouch? Ich darf also im Handler keinen log mit fstream schreiben? Verstehe ich das richtig? Meine Logfunktion hat dazu noch eine static-Variable 😞

    Ist doch doof! Warum diese Einschränkung? Vor Ende der main() darf man das ja auch noch tun...

    😕


  • Mod

    linux_newbe schrieb:

    Warum diese Einschränkung?

    Besonders in der C-Bibliothek sind viele Funktionen nicht reentrant.

    signal solltest du sowieso nicht benutzen, auch aus ganz anderen Gründen nicht. Du benutzt Linux? Lies mal die Manpage von signal(2) für eine Erklärung und Hinweise zu besseren Alternativen.



  • Aha okay.

    Hm ich versuch's mal mit sigaction().

    Ich versuche übrigens einfach, eine Qt Anwendung sauber zu beenden, also noch gewissen cleanup-Code auszuführen. Leider erkennt Qt nicht, wenn ein Signal ankommt (aboutToQuit, qAddPostRoutine oder einfach das Ende von main, nichts wird ausgeführt).

    Gibt es da einen besseren Weg? Ansonsten würde ich bei einem Signal einfach QCoreApplication::quit() aufrufen.



  • Es ist halt schon blöd, dass man bei einem Signal keine stdlib-Funktionen mehr aufrufen soll... Ich würde zB. gerne "Programm beendet" in eine Logdatei schreiben.

    Gibt es unter Linux noch andere Möglichkeiten, ein Programm sauber zu beenden? Ich denke da an sowas wie WM_CLOSE bei Windows...



  • Wenn ich im Signalhandler QCoreApplication::quit() aufrufe, ist das aber doch eigentlich eine race condition. quit() ist nämlich nicht threadsafe...
    Und das Programm könnte ja gerade die event-queue durchlaufen, während das signal kommt und ein quit-event oder so posten will...

    😕




Anmelden zum Antworten