Ist es möglich, starten Sie ein Programm innerhalb eines Programms?
Ich bin der Entwicklung eines C++ - Programms, und es wäre nützlich zu verwenden, eine Funktion, ein Skript oder sowas, dass macht das Programm neu starten. Es ist ein großes Programm, so dass ein Neustart alle Variablen manuell wird mich lange Zeit...
Ich weiß nicht, ob es irgendeinen Weg gibt, dies zu erreichen, oder wenn es möglich ist.
InformationsquelleAutor der Frage Julen Uranga | 2016-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wirklich brauchen, um neu zu starten das ganze Programm (also auf "schließen" und "öffnen" wieder), der "richtige" Weg wäre, um ein separates Programm, mit dem alleinigen Zweck, einen Neustart Ihres Haupt. AFAIK eine Menge von Applikationen mit auto-update-Funktion funktionieren auf diese Weise. Also, wenn Sie brauchen, um starten Sie Ihr Haupt-Programm, rufen Sie einfach die "restarter" ein, und beenden.
InformationsquelleAutor der Antwort SingerOfTheFall
Können Sie eine Schleife verwenden, die in Ihrem
main
Funktion:Oder, wenn Sie wollen, um tatsächlich starten Sie das Programm, führen Sie es aus einem Auffanggurt:
wo
42
ist ein return-code bedeutet "Neustart, bitte".Dann innerhalb des Programms Ihre
restart
- Funktion würde wie folgt Aussehen:InformationsquelleAutor der Antwort krzaq
Auf Unicies, oder irgendwoanders haben Sie
execve
und es funktioniert wie die man-Seite gibtkönnen Sie einfach...mich zu töten, für die Verwendungatoi
weil es in der Regel schrecklich, außer für diese Art von Fall.Beispiel:
(7) - der return-code).
Es weder eine Rekursion noch explizit loops -- statt, es nur sich selbst nennt, ersetzt seine eigenen Speicherbereich mit einer neuen version von sich selbst.
In dieser Weise, wird der Stapel wird nie überlaufen, wenn alle vorherigen Variablen werden erneut deklariert, wie mit jedem reinvocation -- die
getchar
rufen Sie verhindert, dass 100% CPU-Auslastung.Im Falle einer selbst-Update-binary, da der gesamte binäre (zumindest auf Unix-likes, ich weiß nicht über Windows) kopiert werden in den Speicher zur Laufzeit, dann, wenn die änderungen einer Datei auf der Festplatte, bevor die
execve(argv[0], ...
nennen, die neue Binärdatei gefunden auf der Festplatte, nicht die gleichen alten, ausgeführt wird, statt.Als @CarstenS und @Bischof hinweisen in den Kommentaren, durch die einzigartige Weise, in der Unix entwickelt wurde, öffnen Sie den Datei-Deskriptoren sind gehalten, über
fork
/exec
und als ein Ergebnis, um zu vermeiden undicht offene Datei-Deskriptoren, die über mehrere Aufrufe hinweg zuexecve
sollten Sie entweder schließen Sie Sie, bevorexecve
oder öffnen Sie Sie mite
FD_CLOEXEC
/O_CLOEXEC
in den ersten Platz-mehr Informationen finden Sie auf Dan Walsh ' s blog.InformationsquelleAutor der Antwort cat
Dies ist eine sehr OS-spezifische Frage. In Windows können Sie die Ein Neustart der Applikation API oder MFC-Manager neu Starten. In Linux könnte man eine
exec()
Aber die meisten der Zeit, es ist eine bessere Lösung. Du bist wahrscheinlich besser dran mit einer Schleife, wie bereits in anderen Antworten.
InformationsquelleAutor der Antwort BlueRaja - Danny Pflughoeft
Das klingt wie der falsche Ansatz, wie alle deine state ist global und so ist die einzige klare Methode haben Sie alles zurückzusetzen (außer manuell zuweisen "default" - Werte zu jeder variable) ist neu zu starten, das ganze Programm.
Statt, Ihr Zustand gehalten werden soll, in der Objekte (der Klasse Typ, oder was auch immer). Sie sind dann frei, das erstellen und vernichten Sie diese Objekte, wenn Sie möchten. Jedes neue Objekt hat einen frischen Zustand mit "default" - Werte.
Kämpfen nicht C++; verwenden Sie es!
InformationsquelleAutor der Antwort Lightness Races in Orbit
Müssen Sie wahrscheinlich einen loop:
Jedes mal, wenn Sie brauchen, um neu zu starten, rufen Sie
continue;
innerhalb der Schleife, und bis zum Ende in Ihrem Programm verwendenbreak;
.InformationsquelleAutor der Antwort Arnav Borborah
Wenn ich entwickeln Echtzeitsysteme mein Ansatz ist in der Regel ein "abgeleitet main()" wo Schreibe ich den gesamten code aus aufgerufen, eine echte main(), so etwas wie:
Die main.cpp Programm:
Die programmain.cpp, wo alle code geschrieben:
So, jedes mal, wenn wir entscheiden, um das Programm zu beenden, wird das Programm neu gestartet werden.
Detail: alle Variablen globals und Logik geschrieben werden müssen, innerhalb
programMain()
- innen nichts"main()"
außer der restart-control.Dieser Ansatz funktioniert in beiden Linux-und Windows-Systemen.
InformationsquelleAutor der Antwort Mendes
Es klingt für mich so, da Fragen Sie die falsche Frage, weil Sie nicht genug wissen über die Codierung die richtige Frage zu stellen.
Was es klingt wie Sie Fragen, ist, wie code zu schreiben, wo, auf einen verpassten Anruf, er läuft wieder rund auf den ursprünglichen Zustand und startet das ganze Gespräch/Ort Sequenz. In dem Fall müssen Sie eine Zustandsautomaten. Nachschlagen, was das ist, und wie zu schreiben. Dies ist einer der wichtigsten software-Konzept, und Sie sollten es wissen, wenn Ihre Lehrer waren alle gut in Ihrem job.
Als seitliche Anmerkung, wenn das Programm dauert 5s initialisieren Sie alle Variablen, die es noch zu nehmen, 5s, wenn Sie es neu starten. Sie können keine Verknüpfung. Also es sollte klar sein, dass Sie nicht wirklich wollen, zu töten, und starten Sie Ihr Programm, denn dann bekommen Sie genau die Verhaltensweisen, die Sie nicht wollen. Mit einer state-Maschine, die Sie haben könnte eine Initialisierung Zustand für kalt-Start, wo das system gerade erst eingeschaltet worden ist, und eine zweite Initialisierung Zustand nach einem warmen Neustart.
Oh, und 6 threads ist auch nicht sehr viele! 🙂
InformationsquelleAutor der Antwort Graham
Je nachdem, was du damit meinst "Neustart" des Programms, kann ich sehen, einige einfache Lösungen.
Einem einbetten, Ihr ganzes Programm in einigen "Programm" Klasse, dass sieht im wesentlichen vor, einige Schleife, das richtige Programm. Wenn Sie müssen das Programm neu starten, rufen Sie die statische öffentliche Methode "neu Starten" , startet die Schleife erneut.
Könnten Sie auch versuchen, um system-spezifische Berufung, die würde starten Sie Ihr Programm erneut und beenden.
Wie bereits in anderen Antworten, Sie konnte erstellen Sie ein wrapper-Programm, die zu diesem Zweck(und check-return-code, um zu wissen, ob Sie beenden oder neu starten).
Die andere einfache Möglichkeit ist die Verwendung
goto
. Ich weiß, dass die Menschen mich hassen für auch es zu erwähnen, aber lassen Sie s face it: wir wollen einfaches Programm, kein schöner Abbinder. Gehe zurück Garantien Zerstörungso könnte man ein Programm erstellen, mit einem label in den Anfang, und eine Funktion "neu Starten", die gerade zurück an den Anfang geht.Welche option Sie wählen, es zu dokumentieren sowie, so dass andere(oder Sie in der Zukunft) eine WTF weniger.
PS. Wie bereits erwähnt, durch alain
goto
nicht zerstören wird global noch statische Objekte, gleiche würde für umschließenden Klasse. Daher ist jeder Ansatz, der nicht die gehören ab neuen Programms anstelle der aktuellen sollte man entweder verzichten, Globale/statische Variablen, oder nehmen Sie die richtigen Maßnahmen, um neu eingestellt(obwohl das könnte etwas mühsam sein, da mit der Ergänzung der jedes statische/Globale, müssen Sie zum ändern der restart-routine).InformationsquelleAutor der Antwort MatthewRock