C - Muss exec in einem Multithread-Prozess sofort fork folgen?

8

Situation: Ich habe ein Multithread-Programm, das in C geschrieben wird. Wenn einer der Threads fork, wird der unterordnete Prozess durch einen anderen ersetzt, der exec () verwendet, und das übergeordnete Element wartet auf das Kind, um zu beenden.

Problem: Nachdem der untergeordnete Prozess von fork () erstellt wurde, gibt es einige Zeilen Code, die die Argumente kompilieren, die im folgenden Befehl exec () verwendet werden.

Hypothese Bin ich richtig in der Annahme, dass in der Zeit zwischen dem Child-Prozess, der durch fork () erstellt und durch exec () ersetzt wird, der Child-Prozess - eine Kopie des Elterns - alle Threads des Elterns und daher diese Threads haben wird wird laufen - wenn auch nur für eine sehr kurze Zeit?

Wenn ja, ist die richtige Lösung, exec () unmittelbar nach fork () aufzurufen?

    
SlappyTheFish 19.11.2010, 09:18
quelle

3 Antworten

9

Nur der Thread, der fork aufruft, wird im neuen Prozess ausgeführt. Es gibt jedoch Einschränkungen, welche Funktionen Sie vor exec aufrufen können. Von fork :

  

Ein Prozess soll mit einem erstellt werden   einzelner Thread. Wenn ein Multi-Thread   Prozessaufrufe fork() , der neue Prozess   soll eine Replik des Aufrufenden enthalten   Thread und sein gesamter Adressraum,   möglicherweise einschließlich der Staaten von   Mutexe und andere Ressourcen.   Folglich, um Fehler zu vermeiden, die   Kindprozess kann nur ausgeführt werden   async-signalsichere Operationen bis   wie eine der exec -Funktionen   wird genannt. Gabel   Handler können durch Mittel festgestellt werden   der pthread_atfork() Funktion in   um die Bewerbung aufrechtzuerhalten   Invarianten über fork() Aufrufe.

Ich glaube, das bedeutet, dass Sie im Allgemeinen in Ordnung sein sollten, so lange wie Multi-Threaded  Bibliotheken verwenden pthread_atfork richtig.

BEARBEITEN: Die Seite pthread_atfork erklärt weiter, wie sich die Bibliothek selbst schützen kann:

  

Die erwartete Verwendung ist, dass die Vorbereitung   Handler erwirbt alle Mutex-Sperren und   die anderen beiden Gabelstapler geben frei   sie.

     

Beispielsweise kann eine Anwendung liefern   eine Vorbereitungsroutine, die den   Notwendig Mutexes die Bibliothek   pflegt und versorgt Kind und Elternteil   Routinen, die diese Mutexe freigeben,   So stellen Sie sicher, dass das Kind eine bekommt   konsistente Momentaufnahme des Zustands von   die Bibliothek (und das sind keine Mutexe   links gestrandet). Alternativ, einige   Bibliotheken könnten nur liefern können   eine Kinderroutine, die das neu initialisiert   Mutexe in der Bibliothek und alle   assoziierte Staaten zu einem bekannten Wert   (Zum Beispiel, was es war, als die   Bild wurde ursprünglich ausgeführt).

    
Matthew Flaschen 19.11.2010, 09:21
quelle
3

Wie @Matthew in seiner Antwort geschrieben hat, sind die anderen Threads des übergeordneten Prozesses im untergeordneten Prozess nicht vorhanden (wenn Sie PThreads verwenden).

Beachten Sie, dass es nicht helfen würde, den Aufruf von exec () unmittelbar nach dem Aufruf von fork zu platzieren, da sonst die Möglichkeit besteht, dass die anderen Threads vor dem Aufruf von exec ausgeführt würden (). Sie können dies jedoch steuern, indem Sie vor dem Aufruf von fork () einen Mutex sperren. Dieser wird durch den Aufruf von exec () im Wesentlichen zerstört.

    
Avi 19.11.2010 09:42
quelle
0

Ich dachte auch, dass alle Threads auch im Child-Prozess repliziert werden. Das stimmt aber nicht. Da andere Threads im untergeordneten Prozess nicht repliziert werden, müssen Sie, wenn Sie Mutexe / Sperren vor exec verwenden, sicherstellen, dass die fork-Handler so geschrieben sind, dass sie sie richtig behandeln. Hier ist ein Artikel darüber. Ссылка

    
cexpert 06.12.2010 14:11
quelle

Tags und Links