2016-04-21 4 views
2

Ich bin auf der Suche nach einer Möglichkeit für die grundlegende Verwaltung von Prozessen in einer plattformübergreifenden Art in C++, aber ich kann keine externen Bibliotheken (wie boost :: process) verwenden. Das Szenario ist dies - ich rufe einen Kindprozess mit std :: system, jetzt für den Fall, dass der Elternprozess mit einem Signal unterbrochen wird, muss ich den Kindprozess vor dem Beenden töten, um es als Zombie zu vermeiden. Ich habe die Signalverarbeitung gelesen, aber ich bin mir nicht sicher, wie ich einen mit std :: system in der Handle-Funktion erstellten Prozess beenden kann. Gibt es einen anderen/besseren Weg, dies zu tun?Starten und Beenden von Prozessen in C++ Cross-Plattform

+0

Wenn der Elternteil stirbt Das Kind wird zur Waise und nicht zum Zombie. Ein Zombie ist ein totes Kind, das nicht geerntet wird. –

+0

Die Lösungen dazu sind systemabhängig. Ihrer Beschreibung nach scheinen Sie auf einem Unix (z. B. Linux, BSD usw.) oder ähnlichem zu sein. Ist es POSIX? Wenn dies der Fall ist, verfügen Sie über eine Reihe plattformbezogener Funktionen, die Sie zum Suchen/Löschen von Prozessen verwenden können (einige Aspekte von Posix sind jedoch lose spezifiziert, so dass Implementierungen zwischen Systemen variieren). Wenn Sie eine Mischung aus Zielsystemen (zB Posix und Non-Posix) haben, werden Sie definitiv verschiedene Lösungen für verschiedene Ziele benötigen. In Standard-C++ gibt es keine andere Lösung als die Verwendung von Drittanbieter-Bibliotheken (die wiederum für die Plattformabhängigkeiten sorgen). – Peter

Antwort

1

C++ hat vor kurzem Semantik für Threading bekommen, aber es hat (noch?) Keine Semantik für Prozesse. Daher bietet es keine Möglichkeit zum Löschen eines Prozesses, der auf Ihrem System ausgeführt wird.

Der einzige praktikable Ansatz besteht daher darin, den Elternprozeß eine Art von Signal an den Kindprozess senden zu lassen und den Kindprozeß nach Signalempfang selbst beenden zu lassen. Es gibt mehrere Möglichkeiten, diese Signalisierung durchzuführen (z. B. durch OS-Signale, durch Standard-IPC-Primitive, durch Vernetzung), aber Standard-C++ stellt für die meisten von ihnen keinen tragbaren Mechanismus bereit. Am Ende entscheiden Sie sich für eine externe Bibliothek (z. B. Boost, Qt usw.) oder beschränken Ihre Implementierung auf eine Reihe unterstützter Systeme (z. B. POSIX-Betriebssysteme, in diesem Fall können Sie sogar direkt auf kill zugreifen). .

1

Prozessverwaltung ist spezifisch für jede Plattform. Der klassische Weg (Wenn Sie keine externen Bibliotheken verwenden wollen) ist Code schreiben, für jede Plattform und trennen sie mit Kompilierung-Präprozessorbedingungen:

// For both OS X and iOS 
#ifdef __APPLE__ 
    // includes or code 
#endif 

// For Windows: 
#ifdef __MINGW32__ 
    // includes or code 
#endif  

// For Linux: 
#ifdef __linux__ 
    // includes or code 
#endif 

Hier weitere Lösungen ist: How to identify platform/compiler from preprocessor macros?

Verwandte Themen