2017-10-18 2 views
0

Einige Bibliotheken registrieren möglicherweise einige Handler mit pthread_atfork(). Ich brauche sie nicht, da ich nur fork() zusammen mit exec() verwende. Außerdem können sie in einigen Fällen Probleme verursachen. Gibt es eine Möglichkeit, die registrierte Handlerliste zurückzusetzen?Zurücksetzen von Handlern, die von pthread_atfork registriert wurden

In Verbindung stehend: calling fork() without the atfork handlers, fork() async signal safety.

+0

Das primäre dokumentierte operationelle Problem mit 'atfork'-Handlern beinhaltet den Fall, in dem' fork() 'von einem Signal-Handler aufgerufen wird und somit die' atfork'-Handler im Kontext des Signal-Handlers aufgerufen werden. Ist das ein Problem, um das Sie sich eigentlich kümmern müssen? –

Antwort

0

POSIX dokumentiert keinen Mechanismus für die von pthread_atfork() installierten Gabelsteuerungen, die entfernt werden müssen, kurz vor Beendigung des Prozesses oder Ersetzen des Prozessabbilds. Wenn Sie sie nicht möchten, dann installieren Sie sie nicht. Wenn sie von einer Drittanbieter-Bibliothek installiert werden, wie Sie es beschreiben, dann haben Sie die Möglichkeit, dieses Verhalten der Bibliothek zu vermeiden (möglicherweise indem Sie die Bibliothek ganz vermeiden) oder damit zu leben.

+0

Ich lese über 'UNREGISTER_ATFORK'. Ist das eine Lösung? – Albert

+0

Sie müssen mir da draußen helfen, @ Albert. Wo hast du darüber gelesen? Soweit ich feststellen kann, wird von POSIX keine solche Kennung für irgendeine Entität angegeben. Es sieht so aus, als ob GLIBC eine interne Funktion mit einem ähnlichen Namen haben könnte, aber wenn dies der Fall ist, soll GLIBC nicht direkt aufgerufen werden und ist nicht portierbar. –

+0

In der [Glibc 'fork.h'] (https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/generic/fork.h;h=623cae28dfa22d00ed09b8842ca36f44f733942c;hb=HEAD), heißt es UNREGISTER_ATFORK, wenn es definiert ist, muss es zu einem Funktionsaufruf erweitert werden, der einen void * -Parameter benötigt, der das DSO-Handle für das DSO ist, das entladen wird. Die so genannte Funktion muss die von diesem Modul registrierten Atfork-Handler entfernen. Ich habe gesehen, dass einige C++ stdlib-Implementierungen dies verwenden. – Albert

Verwandte Themen