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...

    😕



  • Lösung fĂŒr Qt hier: http://doc.qt.io/qt-5/unix-signals.html 👍


Log in to reply