2015-12-15 141 views
1

這是this question的一個後續步驟。掛起信號處理程序中的線程執行

假設我使用sigaction來設置我自己設計的信號處理程序。在這個信號處理程序中,我訪問有關CPU狀態的信息(例如線程的堆棧指針)並將其複製到內存中的預定位置。我現在想從另一個線程檢查這個線程堆棧上的值。

有沒有辦法在同一信號處理程序中暫停信號處理程序中線程的執行,以便我可以安全地從另一個線程檢查此線程的堆棧? (注意:我在此定義「安全」意思是「不必擔心線程完成或從函數返回。)

如果我在信號處理程序之外,可以使用sigsupend;但是,使用它並不安全信號處理程序根據the GNU documentation之內。我也可以嘗試延長使用this question描述的方法的信號,但我不認爲任何標準的* nix的信號將幫助我在這裏。

回答

2

一個阻塞read在管是async-signal-safe,並提供了一種方便的方法來喚醒您的「暫停」線程。

例如,

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); 

    ... 
} 
+0

我不確定我關注 - 我正在尋找首先暫停線程,而不是喚醒它。你介意請詳細說明一下嗎? – tonysdg

+0

你想要'sigsuspend'的地方,'讀(pipefd,...)'。修改的答案是否更清晰?你可以保持線程暫停,只要你喜歡,並通過寫入管道的另一端來喚醒它。 – pilcrow

+0

更清晰 - 謝謝你! – tonysdg