5

以下の Rust プログラムstdoutは、atexitハンドラ内でアクセスするとパニックになります。

extern crate libc;

extern "C" fn bye() {
    println!("bye");
}

fn main() {
    println!("hello");
    unsafe { libc::atexit(bye) };
}

出力:

hello
thread '<main>' panicked at 'cannot access stdout during shutdown', ../src/libcore/option.rs:298
fatal runtime error: Could not unwind stack, error = 5
An unknown error occurred

この登録は登録前に実行する必要があるように思われるatexitため、ハンドラーのこの行はカスタム ハンドラーの後にのみ実行する必要があります。したがって、パニックに陥ることはありません。

4

1 に答える 1

8

libc::atexitどちらを呼び出すか、sys_common::at_exit(src/libstd/sys/common/mod.rs で) リンクが指し示すものと初期のクリーンアップ中に Rust が呼び出すものを混乱させています。

これらは 2 つの異なるクリーンアップ キューであり、特定の順序で実行されることに依存したくありません。

于 2016-03-14T08:01:21.557 に答える