Wie kann ich exit-Rost-Programm früh von außerhalb der main-Funktion?
Ich bin in den Prozess des Schreibens ein bash
Klon in Rust. Ich muss mein Programm beenden, wenn der Benutzer Arten exit
. In früheren Versionen von meinem Programm, bevor ich fügte hinzu, mehr komplizierte Funktionen, die ich verwendet return
um aus der Schleife, wurde der Benutzer aufgefordert wird, für die Eingabe. Diese Logik ist jetzt in einer Funktion, wegen der Art, wie ich die Umsetzung built in shell-Funktionen, so dass, wenn ich return
es nur springt aus der Funktion zurück in den Regelkreis, statt durch kurzschließen der Regelkreis und beenden des Programms.
Merke ich, dass ich könnte wahrscheinlich geben einen booleschen Wert zurück, wenn der Benutzer Arten exit
- und Ausfahrt der Schleife, aber ich möchte zumindest wissen, ob der Rost hat eine Art zu beenden, Programme früh, ähnlich wie Java ist System.exit()
, denn dies ist nützlich für bestimmte Arten von Programmen.
- Nein, es gibt keine sichere Art und Weise zu beenden, eine Rost-Programm zu früh. Verursacht jede Aufgabe, um sich vollkommen entspannen (entweder durch Rücksendung oder durch Versäumnis) ist der einzige Weg.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rust 1.0 stable
std::process::exit()
tut genau das - es beendet sich das Programm mit dem angegebenen exit-code:Diese Funktion bewirkt, dass das Programm sofort zu beenden, ohne das abwickeln und ausführen von Destruktoren, so sollte es sparsam verwendet werden.
Alternative (nicht empfohlene) Lösung
Können Sie die C-API direkt. Hinzufügen
libc = "0.2"
zuCargo.toml
, und:Aufrufen von C-Funktionen kann nicht überprüft werden, indem der Rust-compiler, so erfordert dies die
unsafe
block. Ressourcen durch das Programm verwendet wird nicht freigegeben werden, richtig. Dies kann Probleme wie hängende Steckdosen.Soweit ich das verstanden habe, ist der richtige Weg, um zu beenden aus dem Programm zu beenden, alle Fäden irgendwie, dann wird der Prozess beendet sich automatisch.
libc::exit
ist ein schlechte Idee. Es beendet nicht den Prozess sauber und zerbrechen Dinge gefährlich. Normaler Rost-Prozess Fazit muss umfassen stack unwinding, so dass Destruktoren aufgerufen werden, währendexit(3)
's Ansatz zum Abschluss ist ganz anders und nicht mit stack unwinding. So, wenn Sie Dinge wie das öffnen von Dateien, Sie können nicht geleert werden und geschlossen werden TCP-sockets gebunden werden möglicherweise nicht ordnungsgemäß freigegeben werden (d.h. man kann nicht binden an die Buchse, bis ein timeout abgelaufen ist, wohl eine minute oder so), &. c.—dielibc::exit
ist im Grunde äquivalent zu einem segmentation Fault, nicht eine saubere beenden.1
src\main.rs:14 std::Prozess:exit(1);Beispiel:
In älteren Unterlagen, sehen Sie dies als scheitern!("Oh Nein, etwas schlimmes hier passiert ist.")
Für einige Grund, dieses makro wurde geändert von fail in Panik zu geraten. Panik ist der Weg zu scheitern, wenn Sie müssen.
[edit] tut mir Leid. Es sieht aus, wie Sie sein sollte Test-Eingang für die Zeichenfolge "exit", das würde davon abhängen, wie Sie unter input (durch Linie oder durch args). Dann können Sie das Programm mit break aus der Schleife, unter der Bedingung, dass der Ausgang erkannt wird.
Beispiel:
panic!
tut, ist ordnungsgemäß beendet die aktuelle Aufgabe. Wenn die Funktion momentan nicht auf die wichtigste Aufgabe ist dann diepanic!
nichtexit
dem Programm. Und selbst wenn es ist, es ist nicht das gleiche wieexit
, dapanic!
laufen die Destruktoren mit beliebigem code.