私は失敗する可能性のあるmalloc
を実行するCライブラリをラッピングしています。残りのRustはOOMで異常終了しますので、同じことをしたいと思います。 std::intrinsics::abort()
とcore::intrinsics::abort()
があります(違いは何ですか?)どちらも不安定です。錆処理を中止するにはどうしたらいいですか?
安定した錆で中断するにはどうしたらいいですか?
私は失敗する可能性のあるmalloc
を実行するCライブラリをラッピングしています。残りのRustはOOMで異常終了しますので、同じことをしたいと思います。 std::intrinsics::abort()
とcore::intrinsics::abort()
があります(違いは何ですか?)どちらも不安定です。錆処理を中止するにはどうしたらいいですか?
安定した錆で中断するにはどうしたらいいですか?
錆コードは、通常とリンクされているのでabort()
機能はSIGABRT
を発生させ、本来のGENながら:これは実際に固有abort
異なること
extern {
fn abort();
}
fn main() {
unsafe { abort(); }
}
注:abort
が定義されているCランタイムライブラリは、あなたがextern
ブロックを使用してその機能をインポートすることができます無効な命令(ud2
)が発生し、SIGILL
が発生します。
うまくいけば、std::process::abort
は今後安定します。
panic!()
に電話することができます。
あなたが失敗した割り当てを傍受し、安定したプログラム状態で錆に戻ることができますしかし、もし、私が(など、Result
を使用して)それがエラーを報告した方が良いと思う
私はOOM上で錆コードが 'panic!()'をしていないと推測します。なぜそれを使用したくないのですか? – Timmmm
@Timmmmこれは、Rustがunwindを仮定してメモリを割り当て、1つのOOMが他に何も割り当てできないことを意味するからです。個人的には、それは「悲観的すぎて問題を引き起こす」と思う(https://internals.rust-lang.org/t/could-we-support-unwinding-from-oom-at-least-for-collections/3673)。 – Kornel