2015-12-15 140 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