簡體   English   中英

在信號處理程序中掛起線程執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM