Как очистить программу с кодом выхода?
Есть ли способ вернуть код выхода в Rust 1.0?
Я пробовал env::set_exit_status(exit_code);
, но это порождает ошибку компилятора.
Существует также этот вопрос: Запустить программу Rust early, которая похожа, но спрашивает о том, когда процесс должен быть удален раньше.
EDIT: Я ищу решение, которое также позволит процессу убрать стек, вызвать деструкторы и т.д.
Ответы
Ответ 1
Основываясь на комментариях @FrancisGagné answer, если вы ищете эквивалент C return exit_code
, вы можете искусственно построить его таким образом:
fn main() {
let exit_code = real_main();
std::process::exit(exit_code);
}
fn real_main() -> i32 {
// the real program here
}
Таким образом, все объекты вашей программы будут находиться в области функции real_main()
, и вы можете безопасно использовать return exit_code;
в main
, пока все деструкторы будут правильно выполняться.
Было бы более целесообразно использовать std::env::set_exit_status(..)
, но эта функция еще не находится в стабильной Rust.
Ответ 2
std::process::exit
выходит из программы с указанным кодом выхода.
Ответ 3
Начиная с Rust 1.26, функция main
больше не ограничивается ()
: main
также может возвращать Result<(), E>
для любого типа E: Debug
. Значение Ok
отображается на EXIT_SUCCESS
(который равен 0 на всех платформах), а значение Err
отображается на EXIT_FAILURE
(который равен 1 на всех платформах). Значение ошибки также автоматически выводится в стандартный поток ошибок.
В будущем Rust будет поддерживать еще больше типов возвращаемых данных для main
. Черта Termination
(нестабильная с версии 1.31.1) определяет все эти типы. Задача trait заключается в преобразовании значения в i32
выхода i32
. Когда Termination
стабилизируется, приложения, естественно, смогут реализовать эту черту самостоятельно, чтобы предоставить свой собственный тип результата.