为什么 atexit 处理程序在访问 stdout 时会出现恐慌?
Why does an atexit handler panic when it accesses stdout?
下面的 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 should run before our atexit
registration, so this line 应该 运行 仅在我们的自定义处理程序之后。因此它不应该恐慌。
你混淆了你调用的 libc::atexit
和你的 link 指向的 sys_common::at_exit
(在 src/libstd/sys/common/mod.rs 中)以及 Rust 在早期调用的清理。
这是两个不同的清理队列,我不想依赖它们按特定顺序执行。
下面的 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 should run before our atexit
registration, so this line 应该 运行 仅在我们的自定义处理程序之后。因此它不应该恐慌。
你混淆了你调用的 libc::atexit
和你的 link 指向的 sys_common::at_exit
(在 src/libstd/sys/common/mod.rs 中)以及 Rust 在早期调用的清理。
这是两个不同的清理队列,我不想依赖它们按特定顺序执行。