首页 文章

为什么atexit处理程序在访问stdout时会感到恐慌?

提问于
浏览
3

下面的Rust程序在 atexit 处理程序中访问 stdout 时会发生混乱 .

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

在我看来this registration应该在我们的 atexit 注册之前运行,所以处理程序中的this line应该只在我们的自定义处理程序之后运行 . 因此它不应该恐慌 .

1 回答

  • 7

    您混淆了 libc::atexit ,您调用它,以及 sys_common::at_exit (在src / libstd / sys / common / mod.rs中)您的链接指向哪个以及Rust在早期清理期间调用的内容 .

    这是两个不同的清理队列,我不想依赖它们按特定顺序执行 .

相关问题