如何在Linux中处理异步信号?

时间:2011-05-06 01:32:45

标签: linux unix signals

这似乎是一个愚蠢的问题,但我无法在任何地方找到答案。我知道在UNIX中,信号是异步处理的。如果我编写一个处理信号的函数,该函数在哪里运行?产生了一个新的线程?现有的线程是否以某种方式中断?或者这是在异步I / O这样的系统线程中处理的吗?

3 个答案:

答案 0 :(得分:6)

执行信号功能,就好像进程中的线程已被中断一样。也就是说,使用信号线程调用信号处理程序并重新排列堆栈,以便在信号处理程序返回时线程继续执行。没有引入新的线程。

答案 1 :(得分:2)

在函数返回之前,中断现有的进程线程。它可以安全地做什么以确保它不会破坏线程处于中间的函数调用状态有严重的限制 - 具体来说,它调用的线程可能已经调用的任何函数必须是异步重入。参见手册页,例如信号,sigaction以获取更多详细信息或根据您的喜好提出更具体的问题。

答案 2 :(得分:2)

它不是一个单独的线程,但你的代码被匆忙暂停。这就是为什么只有POSIX调用的有限子集可用。

来自signal man page

  

例程处理程序必须非常小心,因为其他地方的处理在某个任意点被中断。 POSIX具有“安全功能”的概念。如果信号中断了不安全的函数,并且处理程序调用了不安全的函数,则行为是未定义的。安全功能在各种标准中明确列出。