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
Antwort
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). .
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?
- 1. Auflisten und Beenden von Prozessen in .Net
- 2. Verwenden von Identitätswechsel zum Starten von Prozessen (indirekt) in C#
- 3. Automatisches Schließen von Prozessen beim Beenden von tmux
- 4. C# und C++ Synchronisieren zwischen Prozessen
- 5. Starten und Stoppen von firefox von C#
- 6. C# Erkennen von erzeugten Prozessen
- 7. Starten von Remote-Prozessen in einem Windows-Netzwerk
- 8. Google DataLab-Instanz beenden und neu starten?
- 9. Bash Array von IDs zum Starten von Prozessen erstellen
- 10. Starten und Beenden von SQL Server auf meinem Entwicklungs-Laptop
- 11. Gemeinsamer Speicher zwischen C++ - und Java-Prozessen
- 12. Neue Aktivität starten und die aktuelle in Android beenden?
- 13. Getötete Prozesse beim Beenden beenden
- 14. Python Multiprocessing, Ärger Beenden von Prozessen auf Neustart und zur Verhütung Zombies
- 15. und nicht beenden Aktivität
- 16. Android: Neue Instanz der vorherigen Aktivität starten und dann beenden
- 17. Prozess starten und zu einem späteren Zeitpunkt beenden
- 18. killing Reihe von Prozessen
- 19. Wie kann ich einen Prozess in C++ beenden und dann neu starten?
- 20. C# - WCF - Kommunikation zwischen Prozessen
- 21. Beenden Sie eine Animation und starten Sie dann die andere
- 22. Confused auf "Zombie-Prozessen" in C-Programmierung
- 23. "SendMessage" zu 3 verschiedenen Prozessen in C++
- 24. Abrufen einer vollständigen Liste von Windows-Prozessen in C
- 25. Fehler: Procfile existiert nicht, und Probleme beim Starten von Web-Prozessen
- 26. Beenden von MSI beim Starten einer EXE im Systemkontext
- 27. Überwachung von Windows-Prozessen
- 28. CPU (Benutzer und System) und tatsächliche Nutzungszeit von untergeordneten Prozessen in C
- 29. Heben und Behandlung von Ereignissen in separaten Prozessen
- 30. Abfangen von Signalen aus Prozessen
Wenn der Elternteil stirbt Das Kind wird zur Waise und nicht zum Zombie. Ein Zombie ist ein totes Kind, das nicht geerntet wird. –
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