在Rust中仅向当前线程发送SIGTERM信号

enxuqcxy  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(160)
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发送信号,但它似乎影响所有线程。此外,我尝试在主线程中使用SigSetpthread_sigmask阻塞SIGTERM信号,但这并没有解决问题。
如何确保SIGTERM信号只被当前线程接收?任何帮助将不胜感激。

guicsvcw

guicsvcw1#

POSIX提供pthread_cancel来终止特定的线程。线程取消很难使用,通常需要进程中所有库的支持。此外,在GNU/Linux上,pthread_cancel涉及堆栈展开,而当前的Rust实现不支持跨FFI边界展开。有suggestion to add a C-unwind ABI。即使修复了这个问题,pthread_cancel仍然很难正确使用。
对于您的特定情况,rusty-fork crate可能是使用单独的测试过程实现测试隔离的更好方法,但我自己还没有使用过它。

相关问题