这是this question的后续行动。
假设我使用sigaction
来设置我自己设计的信号处理程序。在该信号处理程序中,我访问有关CPU状态的信息(例如,线程的堆栈指针)并将其复制到存储器中的预定位置。我现在想从另一个线程检查这个线程堆栈的值。
有没有办法在同一个信号处理程序中暂停信号处理程序中线程的执行,这样我就可以安全地从另一个线程中检查这个线程的堆栈了? (注意:我定义"安全"这里意味着"不用担心线程完成或从函数返回。)
如果我在信号处理程序之外,我可以使用sigsupend
;但是,根据the GNU documentation在信号处理程序中使用它是不安全的。我也可以尝试使用this question中描述的方法扩展信号,但我不认为任何标准的* nix信号对我有帮助。
答案 0 :(得分: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);
...
}