2011-05-06 26 views
7

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

回答

2

现有的进程线程被中断,直到函数返回。对于确保它不会破坏线程处于中间位置的函数调用状态,有一些严格的限制,特别是它调用的线程可能已经调用的任何函数都必须是异步可重入的。请参阅手册页,例如信号,进一步的细节sigaction或如果你喜欢问更具体的问题。

6

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

2

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

signal man page

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