[英]Suspending thread execution within signal handler
這是對該問題的后續措施。
假設我使用sigaction
來設置自己設計的信號處理程序。 在此信號處理程序中,我訪問有關CPU狀態的信息(例如,線程的堆棧指針),並將其復制到內存中的預定位置。 現在,我想檢查另一個線程在該線程堆棧上的值。
有沒有辦法從同一信號處理程序中掛起信號處理程序中線程的執行,以便我可以安全地從另一個線程檢查該線程的堆棧? (注意:我在這里將“安全”定義為“不必擔心線程完成或從函數返回。”)
如果我不在信號處理程序之外,則可以使用sigsupend
; 但是,根據GNU文檔,在信號處理程序中使用它並不安全。 我也可以嘗試使用此問題中描述的方法擴展信號,但我認為任何標准* nix信號都不會對我有所幫助。
管道上的阻塞read
是異步信號安全的 ,並提供了一種方便的方式來喚醒“掛起”的線程。
例如,
static int the_pipe[2] = {-1, -1}; // file descriptors allocated in main via pipe()
static void
siginfo_handler(int s, siginfo_t *si, void *ctx) {
char c;
// do something with (ucontext_t *)ctx
// now wait for someone else to wake us up
read(the_pipe[0], &c, 1);
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.