use nix::sys::signal::{self, SigSet};
#[tokio::test]
async fn test_shutdown() {
let server = TestServer::new().await;
let proxy = ProxyUnderTest::new(server.listen_port).await;
sleep(std::time::Duration::from_millis(50));
let current_thread_id = unsafe { libc::pthread_self() };
println!("current_thread_id :{:?}", current_thread_id);
// Send the SIGTERM signal to the current thread.
nix::sys::signal::pthread_kill(current_thread_id, signal::Signal::SIGTERM).unwrap();
// Block the SIGTERM signal in the main thread.
let mut sigset = SigSet::empty();
sigset.add(signal::SIGTERM);
signal::pthread_sigmask(signal::SigmaskHow::SIG_BLOCK, Some(&sigset), None).unwrap();
// Wait for the proxy to shutdown.
let reason_opt = proxy.handle.await.unwrap();
assert_eq!(reason_opt, Some(ShutdownReason::GracefulShutdown));}
我想在Rust测试中只向调用线程发送SIGTERM
信号,但目前,该信号被cargo test
派生的所有其他线程接收。如何解决此问题?
我尝试使用pthread_kill
发送信号,但它似乎影响所有线程。此外,我尝试在主线程中使用SigSet
和pthread_sigmask
阻塞SIGTERM
信号,但这并没有解决问题。
如何确保SIGTERM
信号只被当前线程接收?任何帮助将不胜感激。
1条答案
按热度按时间guicsvcw1#
POSIX提供
pthread_cancel
来终止特定的线程。线程取消很难使用,通常需要进程中所有库的支持。此外,在GNU/Linux上,pthread_cancel
涉及堆栈展开,而当前的Rust实现不支持跨FFI边界展开。有suggestion to add aC-unwind
ABI。即使修复了这个问题,pthread_cancel
仍然很难正确使用。对于您的特定情况,
rusty-fork
crate可能是使用单独的测试过程实现测试隔离的更好方法,但我自己还没有使用过它。