Vorbehalte bei der Implementierung von Signal.trap-Callbacks

Wie bei der Implementierung von Signal-Handlern in C oder den meisten anderen Sprachen muss aller Code, der an Signal.trap übergeben wird, reentrant sein. Wenn Sie mit Reentrancy nicht vertraut sind, müssen Sie sich auf Wikipedia oder anderswo darüber informieren, bevor Sie den Rest dieses Dokuments lesen.

Am wichtigsten ist, dass „Thread-Sicherheit“ keine Reentrancy garantiert; und Methoden wie Mutex#lock und Mutex#synchronize, die üblicherweise für Thread-Sicherheit verwendet werden, verhindern sogar die Reentrancy.

Ein Implementierungsdetail der Ruby VM

Die Ruby VM verzögert die Ausführung von Signal.trap-Callbacks, bis es für ihre internen Datenstrukturen sicher ist, aber sie weiß nicht, wann es für Datenstrukturen in IHREM Code sicher ist. Ruby implementiert verzögerte Signalbehandlung, indem es kurze C-Funktionen registriert, die nur async-signal-sichere Funktionen als Signal-Handler verwenden. Diese kurzen C-Funktionen tun nur genug, um die VM anzuweisen, die über Signal.trap registrierten Callbacks später im Haupt-Ruby- Thread auszuführen.

Unsichere Methoden zum Aufrufen in Signal.trap-Blöcken

Im Zweifelsfall sollten Sie alles als unsicher betrachten, was nicht als sicher aufgeführt ist.

Gängige sichere Operationen innerhalb von Signal.trap-Blöcken

Systemaufruf-Wrapper-Methoden, die innerhalb von Signal.trap sicher sind

Da Ruby Wrapper um viele async-signal-sichere C-Funktionen hat, sind die entsprechenden Wrapper für viele IO, File, Dir und Socket-Methoden sicher.

(Unvollständige Liste)